пользовательский оператор c ++ новый

0

Привет, я недавно делал некоторые чтения и решил попробовать реализовать пользовательский новый оператор, поэтому я мог бы записывать в текстовый файл, когда память выделяется и удаляется, чтобы найти утечки памяти.

Одна из проблем, с которыми я сразу сталкиваюсь, заключается в том, что когда я перегружал новую функцию и помещал туда печать, функция вызывается дважды.

Мне было интересно, правильно ли это, и если да, то почему?

#include <iostream>
#include <string>

void* operator new(size_t size)
{
    void* storage = malloc(size);
    std::cout << "Hello World! ";
    return storage;
}
int main()
{
    std::string *s = new std::string("test");
    std::cout << *s;
    return 0;
}

Результаты:

Привет мир! Привет мир! test

Edit: Пробовал без класса string, и теперь он делает это только один раз. Я предполагаю, что есть что-то под этим, что создает его дважды с ленивой инициализацией. Тем не менее, все-таки хотелось бы уточнить.

  • 0
    Для этого есть инструменты, которые сделают вашу жизнь намного проще и намного надежнее, чем просто предоставление пользовательских операторов new и delete . Потратьте свое время, изучая, как использовать их вместо этого.
  • 0
    @CaptainObvlious это для моих личных целей обучения
Показать ещё 6 комментариев
Теги:
memory
new-operator

1 ответ

1
Лучший ответ

std::string - это класс, который выделяет память в куче для хранения своих данных. По дизайну для этого требуются два вызова на new, один для выделения хранилища для фактического строкового класса, и один для выделения массива символов для хранения вашего текста.

#include <iostream>
#include <cstdlib>

void* operator new(std::size_t size)
{
    void* storage = malloc(size);
    std::cout << "Asked for: " << size
        << ", at: " << storage << std::endl;
    return storage;
}

struct A
{
    char * data;
    A() {data = new char[10];}
    ~A() {delete[] data;}
};


int main()
{
    A* ptr = new A;
    return 0;
}

выходы:

Asked for: 8, at: 0x1f68010
Asked for: 10, at: 0x1f68030

Ещё вопросы

Сообщество Overcoder
Наверх
Меню