【问题标题】:What's the difference between new and new[] in C++?C++ 中的 new 和 new[] 有什么区别?
【发布时间】:2018-06-04 18:53:36
【问题描述】:

我正在尝试找出 C++ 内存分配机制。我了解operator new()new 表达式之间的区别。

但是我发现hereoperator new()operator new[]() 的原型几乎相同,operator new[]() 的默认实现应该只是调用operator new() 的相应版本。

我的问题是:

  1. 如果我们可以简单地使用operator new()函数来分配任意大小的内存并将内存用作数组,那么operator new[]()的目的是什么?
  2. 我试过这段代码:

    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[]() 分配的内存的对象? 还有,为什么会崩溃?

【问题讨论】:

标签: c++ memory-management new-operator delete-operator


【解决方案1】:

关于问题 1)。即使operator new()operator new[]() 的默认版本做同样的事情,程序也可以覆盖operator new[] 并使 if 行为不同。这是一个自定义点。

在第 2 部分)。

标准说法中有一个脚注

218) operator new[]operator delete[] 不直接负责记录重复计数或元素大小 数组。这些操作在数组newdelete 表达式中的其他位置执行。但是,数组new 表达式可能会将size 参数增加到operator new[] 以获得存储补充信息的空间。

所以虽然new Myclass[3] 必须将3 存储在某个地方以便delete[] 可以找到它,但显然::operator new[]( sizeof( MyClass) * 3) 没有。至少不在delete[] 期望的地方。

所以看起来delete[] 碰巧找到了其他数字,然后继续摧毁不存在的物体,直到撞到墙上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2021-03-28
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多