C++中的新[]和新[]有什么区别?
What's the difference between new and new[] in C++?
我正在尝试找出C 内存分配机制。我了解operator new()
和new
表达式之间的区别。
但是,正如我在这里发现的那样,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[]
并进行行为不同。这是一个自定义点。
第2部分)。
标准中有一个脚注
218)注意重复计数或元素大小不是
operator new[]
或operator delete[]
的直接责任 数组。这些操作在数组new
和delete
表达式中的其他位置执行。但是,数组new
表达式可能会将size
参数增加到operator new[]
以获取存储补充信息的空间。
因此,虽然new Myclass[3]
必须将3
存储在某个地方,以便delete[]
可以找到它,但显然::operator new[]( sizeof( MyClass) * 3)
没有。至少不是在delete[]
期望的地方。
因此,delete[]
似乎碰巧找到了其他数字,然后继续销毁不存在的对象,直到撞到墙壁为止。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?