【问题标题】:Delete vs Delete[] in a custom operator in C++ (different than common delete vs delete[] questions)C++ 中自定义运算符中的 Delete vs Delete[](不同于常见的 delete vs delete[] 问题)
【发布时间】:2020-05-28 22:06:01
【问题描述】:

我定义了一个名为 MyNewDeleteAllocator 的类,并为该类定义了自定义的 new 和 delete 运算符。这段代码没有任何错误,并且运行良好。但是,我对代码的第 29 行有疑问。似乎将“delete[]”更改为“delete”并没有改变我的代码结果中的任何内容。

我知道 delete(由“new”分配的单个对象)和 delete[](由“new[]”分配的对象数组)之间的区别。

我想知道为什么在第 29 行交换 delete 和 delete[] 不会影响我的结果。

#include <new>
#include <iostream>

using namespace std;

//Allocator class
class MyNewDeleteAllocator {
public:
    MyNewDeleteAllocator() {}
    ~MyNewDeleteAllocator() {}
    static void* operator new (size_t size);
    static void operator delete (void* p);
};

void* MyNewDeleteAllocator::operator new (size_t size) {
    void* p;
    p = malloc(size);
    if (p == NULL) {
        //Throw bad_alloc.
        std::bad_alloc exception;
        throw exception;
    }
    cout << "MyNewDeleteAllocator::operator new called with size_t " << size << endl;
    return p;
}

void MyNewDeleteAllocator::operator delete (void* p) {
    cout << "MyNewDeleteAllocator::operator delete called. " << endl;
    delete[] p; //THIS IS LINE 29
}


int main()
{
    MyNewDeleteAllocator* p = new MyNewDeleteAllocator; //Create MyNewDeleteAllocator object.

    delete p; //Delete MyNewDeleteAllocator object.

    return 0;
}

【问题讨论】:

  • 第29行是哪一个?
  • 您将mallocdelete[] 混合在一起 - 这已经是未定义的行为
  • 第 29 行是删除操作符实现的最后一行
  • 你的operator new返回一个指向用malloc分配的内存的指针——你的operator delete试图通过调用delete[]来释放内存
  • @JohnLee 因为程序的行为未定义。

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


【解决方案1】:

首先,这不是一个分配器,或者你的命名约定是错误的。在 C++ 中,分配器为给定类型分配内存,而不是为原始字节分配内存。更多信息 - https://en.cppreference.com/w/cpp/memory/allocator

第二,不要混用malloc()/deletenew/free()malloc() 应该与free() 一起使用,newdelete 一起使用,而不是相反。更多信息 - https://stackoverflow.com/a/20488420/12979560

因此,您只需将malloc() 替换为new。此外,当您使用new 时,C++ 将抛出std::bad_alloc,以防它无法分配请求的内存。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2018-08-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多