C ++中new和new []之间有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++中new和new []之间有什么区别?相关的知识,希望对你有一定的参考价值。
我试图弄清楚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[]()
分配的内存中?还有,为什么会崩溃?
答案
关于问题1)。即使operator new()
和operator new[]()
的默认版本做同样的事情,程序也可以覆盖operator new[]
并使if表现不同。这是一个定制点。
在第2部分)。
标准中有一个脚注说
218)
operator new[]
或operator delete[]
的直接责任是注意阵列的重复次数或元素大小。这些操作在数组new
和delete
表达式的其他地方执行。然而,数组new
表达式可以将size
参数增加到operator new[]
以获得存储补充信息的空间。
因此,虽然new Myclass[3]
必须将3
存储在某处,以便delete[]
can找到它,显然::operator new[]( sizeof( MyClass) * 3)
不会。至少不在delete[]
期望的地方。
因此,似乎delete[]
碰巧找到了其他一些数字并继续销毁不存在的物体,直到它撞到墙壁。
以上是关于C ++中new和new []之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
在C#中,ToUpper()和ToUpperInvariant()之间有什么区别?