Вызов delete
вызывает деструктор класса, а вызов free()
— нет.
Может ли это вызвать утечку памяти? Если нет, то почему?
#include <iostream>
#include <cstdlib>
using namespace std;
class x{
public:
int a;
~x(){cout<<"destroying"<<endl;}
};
int main() {
x *y = (x*)malloc(sizeof(x));
free(y);
x *z = new x;
delete z;
return 0;
}
new
должен сочетаться с delete
(и new[]
с delete[]
). free
соответствует malloc
.
Это UB , см. например Безопасно ли освобождать память, выделенную new?.
После редактирования строка x *y = malloc(sizeof(x));
даже не скомпилируется.
Вы знаете, что даже не компилируется?
О да, я только что видел этот rn. Я отредактировал это без компиляции, потому что я думал, что это создаст новый контекст бесплатного с новым.
Может ли free() вызвать утечку памяти?
Не как таковой. Но это может вызвать неопределенное поведение. Конечно, если поведение программы не определено, утечка памяти является одним из возможных вариантов поведения. Как и все другие виды поведения.
если x
владеет памятью, например, имеет std::string
память, то это косвенно приведет к утечке памяти
Может ли это вызвать утечку памяти?
В вашем конкретном примере нет. Объект x
просто выделяется malloc()
. free()
будет правильно освобождать память, которую выделено malloc()
. Но объект не будет уничтожен, что хорошо в этом примере, потому что он не был сконструирован с самого начала, поэтому разрушать нечего. Однако если вы попытаетесь использовать этот объект каким-либо образом, предполагающим запуск конструктора, вы окажетесь на территории неопределенного поведения.
C (откуда берутся malloc()
и free()
) не имеет концепции классов, а только памяти (освобождения). C++, с другой стороны, имеет отдельные концепции выделения (де) памяти и (де) построения объекта, поэтому вам нужно быть очень осторожным, чтобы использовать их правильно и не смешивать их неправильно.
Если объект был создан с помощью new
, но затем освобожден с помощью free()
, а не уничтожен с помощью delete
, код определенно имел бы неопределенное поведение, и если бы этот объект внутренне выделил какую-либо дополнительную память для себя, которую деструктор объекта должен освободить, это лишняя память будет утекать, да.
У него неопределенное поведение, поэтому он может вызывать что угодно или вообще ничего.