Привет, я недавно делал некоторые чтения и решил попробовать реализовать пользовательский новый оператор, поэтому я мог бы записывать в текстовый файл, когда память выделяется и удаляется, чтобы найти утечки памяти.
Одна из проблем, с которыми я сразу сталкиваюсь, заключается в том, что когда я перегружал новую функцию и помещал туда печать, функция вызывается дважды.
Мне было интересно, правильно ли это, и если да, то почему?
#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, и теперь он делает это только один раз. Я предполагаю, что есть что-то под этим, что создает его дважды с ленивой инициализацией. Тем не менее, все-таки хотелось бы уточнить.
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
new
иdelete
. Потратьте свое время, изучая, как использовать их вместо этого.