如果使用delete解除分配给malloc的对象,会发生什么?
我正在尝试制作ObjectPool系统。
所以我写了这些代码。
struct A
{
int a;
int b;
int c;
A()
{
std::cout << "A constructor" << std::endl;
}
~A()
{
std::cout << "A destructor" << std::endl;
}
};
A* a = (A*)std::malloc(sizeof(A) * 10);
A* a0 = a;
new (a0) A();
delete a0;
A* a1 = a + 1;
new (a1) A();
delete a1;
.
.
.
A* a9 = a + 9;
new (a9) A();
delete a9; 池化类分配多个对象。
而池化类并不介意释放。
但我担心使用delete释放内存(使用malloc分配)可能会造成内存泄漏。这些代码会导致内存泄漏吗?
我永远不会调用std::free(a)。
只要让用户自己释放内存即可。
发布于 2021-06-06 02:26:39
来自:https://en.cppreference.com/w/cpp/memory/new/operator_delete
如果传递给标准库释放函数的指针不是从相应的标准库分配函数中获得的,则行为未定义。
另外,对于第一个定义:
空操作符删除(空* ptr )抛出();(直到C++11)空操作符删除(空* ptr )无例外;(从C++11开始)
上面写着:
此函数的标准库实现的行为是未定义的,除非ptr是空指针,或者是以前从
operator new(size_t)或operator new(size_t, std::nothrow_t)的标准库实现中获得的指针。
因此,这意味着如果您使用new**,,则_必须在该内存上使用**_;如果您使用 malloc()**,,则E227必须在该内存上使用** free() E133,否则行为将不确定。E234>
“未定义”并不意味着程序不能工作。这意味着语言定义没有指定应该发生什么,因此它可能会工作,也可能不会工作,这取决于编译器的实现。但是,你不能指望它工作,所以它被认为是一个错误,应该被修复。
关于参考信息的说明
https://en.cppreference.com/w/是一个任何人都可以编辑的维基。它不是官方标准,但它是我们拥有的最接近开源的东西。另一个公共标准参考来源是http://www.cplusplus.com,它通常不是最新的,但当它有解释时,我发现它们更好,因为它们更容易理解,但有时更糟糕的是,它们不完整,或者没有涵盖C++11之后的最新版本的C++。所以,将两者一起使用。如果你正在寻找一种更书生气、更新的解释,请更多地依赖于cppreference.com;如果你正在寻找更适合初学者、更容易理解的解释,那么更多地依赖于cplusplus.com,因为它的信息是完整和最新的。
https://stackoverflow.com/questions/67852689
复制相似问题