【发布时间】:2026-01-28 00:35:02
【问题描述】:
你好所以我正在尝试使用预分配内存创建对象和数组。例如,我有以下代码:
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 并告诉它只调用析构函数而不释放内存?
我的第二个问题是使用数组时,就像前面的示例一样,您可以将预分配的内存传递给 new:
int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];
如果我调用delete[],它不仅会调用数组中每个元素的析构函数,还会释放我不想要的内存。我发现应该这样做的唯一方法是遍历数组并显式调用析构函数,然后调用 free。与常规的非数组运算符一样,有没有办法告诉运算符只调用析构函数而不释放内存?
我确实注意到的一件事是,数组的 new 运算符实际上将使用前 4 个字节来存储数组的大小(我只在 Visual Studio 中使用 32 位构建进行了测试)这将帮助我了解如何数组有很多元素,但仍然存在一个问题。如果数组是指针数组怎么办?例如:
Test **arr2 = new Test*[10];
请有人帮我解决这些问题。
【问题讨论】:
-
为什么不重载
new和delete运算符,以便您可以随意分配内存? -
我真的没有考虑过重载它们 b/c 我在想实例化类的人应该决定如何映射内存。
-
@Kunashu 您可以使用 Modern C++ 中描述的模板策略吗?
标签: c++ memory-management new-operator