Kun*_*shu 1 c++ memory-management new-operator
您好我正在尝试使用预分配的内存创建对象和数组.例如,我有以下代码:
int * prealloc = (int*)malloc(sizeof(Test));
Test *arr = new(prealloc) Test();
Run Code Online (Sandbox Code Playgroud)
测试定义如下:
class Test {
public:
Test() {
printf("In Constructor\n");
}
~Test() {
printf("In Destructor\n");
}
int val;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下如果我调用delete它实际上会释放内存不好,b/c也许我正在使用某种类型的内存管理器,所以这肯定会引起一些问题.我在互联网上搜索,我找到的唯一解决方案是明确调用析构函数然后调用free:
arr->~Test();
free(arr);
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?有没有办法调用删除并告诉它只是调用析构函数而不是释放内存?
我的第二个问题是在使用数组时,就像前面的例子一样,你可以传递给新的预分配内存:
int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];
Run Code Online (Sandbox Code Playgroud)
如果我调用delete[]它不仅会为数组中的每个元素调用析构函数,而且还会释放我不想要的内存.我发现它应该完成的唯一方法是遍历数组并显式调用析构函数,然后调用free.与常规无数组运算符一样,有一种方法可以告诉操作员只调用析构函数而不释放内存吗?
我注意到的一件事是数组的new运算符实际上将使用前4个字节来存储数组的大小(我只在Visual Studio中使用32位构建测试了这个)这将帮助我知道有多少元素数组有,但仍有一个问题.如果数组是指针数组怎么办?例如:
Test **arr2 = new Test*[10];
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这些问题.
这是正常的,并期望直接调用析构函数来销毁您使用placement new创建的对象.至于其他任何做事方式,关于唯一明显的选择是使用Allocator对象(至少99%的时候,它只是一个包装新的并直接调用析构函数的包装器).
一般来说,你不希望使用new[]的.您通常希望使用operator new(或可能::operator new)分配原始内存并使用匹配operator delete或释放它::operator delete.
您可以使用placement new在该内存中创建对象,并通过直接调用析构函数来销毁它们.