使用 operator new 和 placement new 分配 vs 构造一个整数数组
Allocate vs construct an array of ints using operator new and placement new
你好,想了解更多 placement new
、operator new
、表达式 delete
.. 以及将初始化与构造分开,我试过这个例子:
int main(){
int* p = static_cast<int*>(operator new[](10 * sizeof(int)));
p = new(p)int[10];
for(int i = 0; i != 10; ++i)
p[i] = i * 7;
for(int i = 0; i != 10; ++i)
std::cout << p[i] << ", ";
operator delete[](p);
}
我编译了它 运行 它工作正常,并使用 Valgrind 检查它是否有内存泄漏,没有报告任何错误。那么它是如何将初始化与分配分开的?
我不确定的是,我使用运算符删除来释放动态数组的内存但没有销毁它(没有放置删除)。那么我的代码中有什么不好的地方吗?
如您所述,没有 placement delete
。使用placement new
时,必须手动调用析构函数,eg:
void* mem = operator new[](10 * sizeof(T));
T* p = new(mem) T[10];
...
for(int i = 0; i < 10; ++i)
p[i].~T();
operator delete[](mem);
其中 T
是所需的元素类型。
调用析构函数对于 POD 类型来说不是很重要,比如 int
,但是对于非 POD 类型来说很重要,比如 std::string
等,以避免泄漏。
你好,想了解更多 placement new
、operator new
、表达式 delete
.. 以及将初始化与构造分开,我试过这个例子:
int main(){
int* p = static_cast<int*>(operator new[](10 * sizeof(int)));
p = new(p)int[10];
for(int i = 0; i != 10; ++i)
p[i] = i * 7;
for(int i = 0; i != 10; ++i)
std::cout << p[i] << ", ";
operator delete[](p);
}
我编译了它 运行 它工作正常,并使用 Valgrind 检查它是否有内存泄漏,没有报告任何错误。那么它是如何将初始化与分配分开的?
我不确定的是,我使用运算符删除来释放动态数组的内存但没有销毁它(没有放置删除)。那么我的代码中有什么不好的地方吗?
如您所述,没有 placement delete
。使用placement new
时,必须手动调用析构函数,eg:
void* mem = operator new[](10 * sizeof(T));
T* p = new(mem) T[10];
...
for(int i = 0; i < 10; ++i)
p[i].~T();
operator delete[](mem);
其中 T
是所需的元素类型。
调用析构函数对于 POD 类型来说不是很重要,比如 int
,但是对于非 POD 类型来说很重要,比如 std::string
等,以避免泄漏。