【发布时间】:2011-05-24 00:11:11
【问题描述】:
fncs: operator new 和 operator new[] 之间有什么区别(NOT new 和 new[] 运算符)?当然调用语法除外?我问是因为我可以使用 ::operator new(sizeof(T)*numberOfObject) 为我的 obj 分配 X 个字节,然后使用数组表示法访问它们,那么 ::operator new[] 有什么大不了的。它只是语法糖吗?
#include <new>
#include <iostream>
#include <malloc.h>
using namespace std;
struct X
{
int data_;
X(int v):data_(v){}
};
int _tmain(int argc, _TCHAR* argv[])
{
unsigned no = 10;
void* vp = ::operator new(sizeof(X) * no);
cout << "Mem reserved: " << _msize(vp) << '\n';
X* xp = static_cast<X*>(vp);
for (unsigned i = 0; i < no; ++i)
{
new (xp + i) X(i);
}
for (unsigned i = 0; i < no; ++i)
{
cout << (xp[i]).data_ << '\n';
}
for (unsigned i = 0; i < no; ++i)
{
(xp + i)->~X();
}
::operator delete(vp);
return 0;
}
【问题讨论】:
-
除了您的代码没有使用标准 C++ 编译器编译(请查看
main的签名)之外,它没有说明使用operator new[]。也许您发布了属于某个其他问题的代码? -
最好不要在有关内存分配函数的问题中发布包含内存泄漏的示例代码。 (除非你问是否有泄漏)
-
@Alf 是的,很抱歉。我用VS。应该这么说
-
您用我认为非法使用
delete的方式替换了内存泄漏。该标准说“delete-expression 操作符会破坏由 new-expression 创建的最派生对象或数组。” vp 确实指向由 new-expression 创建的对象,但它是一个放置 new,并且对 new 和 delete 的调用不匹配。具体来说,以这种方式调用delete vp;不会撤消它之前的vp = ::operator new(sizeof(X) * no);行。 -
@There:有不同的版本让实施者有机会在特定情况下提供适当的优化。