你好所以我正在尝试使用预先分配的内存创建对象和数组。例如,我有以下代码:
int * prealloc = (int*)malloc(sizeof(Test));
Test *arr = new(prealloc) Test();
其中 test 定义如下:
class Test {
public:
Test() {
printf("In Constructor\n");
}
~Test() {
printf("In Destructor\n");
}
int val;
};
在这种情况下,如果我调用 delete 它实际上会释放坏的内存,b/c 也许我正在使用某种类型的内存管理器,所以这肯定会导致一些问题。我在互联网上搜索,我发现的唯一解决方案是显式调用析构函数,然后免费调用:
arr->~Test();
free(arr);
还有另一种方法可以做到这一点吗?有没有办法调用 delete 并告诉它只调用析构函数而不释放内存?
我的第二个问题是使用数组时,就像前面的示例一样,您可以将预分配的内存传递给新的:
int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];
如果我调用delete[]
它,它不仅会为数组中的每个元素调用析构函数,而且还会释放我不想要的内存。我发现应该这样做的唯一方法是遍历数组并显式调用析构函数,然后调用 free。与常规的非数组运算符一样,有没有办法告诉运算符只调用析构函数而不释放内存?
我确实注意到的一件事是,数组的新运算符实际上将使用前 4 个字节来存储数组的大小(我只在 32 位构建的 Visual Studio 中对此进行了测试)这将帮助我知道有多少元素数组有,但还有一个问题。如果数组是指针数组怎么办?例如:
Test **arr2 = new Test*[10];
有人可以帮我解决这些问题吗?