【发布时间】:2018-06-04 18:53:36
【问题描述】:
我正在尝试找出 C++ 内存分配机制。我了解operator new() 和new 表达式之间的区别。
但是我发现here,operator new() 和operator new[]() 的原型几乎相同,operator new[]() 的默认实现应该只是调用operator new() 的相应版本。
我的问题是:
- 如果我们可以简单地使用
operator new()函数来分配任意大小的内存并将内存用作数组,那么operator new[]()的目的是什么? -
我试过这段代码:
struct MyClass { MyClass() { cout << this << "::MyClass()" << endl;} ~MyClass() { cout << this << "::~MyClass()" << endl;} }; int main() { MyClass *ptr = (MyClass *)::operator new[]( sizeof( MyClass) * 3); new (ptr) MyClass; new (ptr+1) MyClass; new (ptr+2) MyClass; delete[] ptr; return 0; }它在崩溃之前打印出以下消息:
0x562ecf758e70::MyClass() 0x562ecf758e71::MyClass() 0x562ecf758e72::MyClass() 0x562ecf758e90::~MyClass() 0x562ecf758e8f::~MyClass() 0x562ecf758e8e::~MyClass() 0x562ecf758e8d::~MyClass() 0x562ecf758e8c::~MyClass() 0x562ecf758e8b::~MyClass() 0x562ecf758e8a::~MyClass() 0x562ecf758e89::~MyClass() 0x562ecf758e88::~MyClass() 0x562ecf758e87::~MyClass() 0x562ecf758e86::~MyClass() 0x562ecf758e85::~MyClass() 0x562ecf758e84::~MyClass() 0x562ecf758e83::~MyClass() 0x562ecf758e82::~MyClass() 0x562ecf758e81::~MyClass() 0x562ecf758e80::~MyClass() 0x562ecf758e7f::~MyClass() 0x562ecf758e7e::~MyClass() 0x562ecf758e7d::~MyClass() 0x562ecf758e7c::~MyClass() 0x562ecf758e7b::~MyClass() 0x562ecf758e7a::~MyClass() 0x562ecf758e79::~MyClass() 0x562ecf758e78::~MyClass() 0x562ecf758e77::~MyClass() 0x562ecf758e76::~MyClass() 0x562ecf758e75::~MyClass() 0x562ecf758e74::~MyClass() 0x562ecf758e73::~MyClass() 0x562ecf758e72::~MyClass() 0x562ecf758e71::~MyClass() 0x562ecf758e70::~MyClass() *** Error in `/home/alec/.cpp-run/1/a.out': free(): invalid pointer: 0x0000562ecf758e68 ***为什么
delete[]试图破坏 30 个不存在且超出operator new[]()分配的内存的对象? 还有,为什么会崩溃?
【问题讨论】:
-
您是说迄今为止网络上没有关于该主题的单篇文章/博客文章?
-
你在做什么在?我的建议是让你不要担心这个,停止使用指针,而只使用普通对象。如果需要单个对象,请使用
MyClass c,如果需要容器,请使用std::vector<MyClass> v。猜测代码不会让你进步,只要从简单的开始。
标签: c++ memory-management new-operator delete-operator