在C ++中的自定义运算符中的Delete vs Delete [](与常见的Delete vs Delete []问题不同)

问题描述 投票:-1回答:1

我定义了一个名为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;
}
c++ memory-management delete-operator
1个回答
0
投票

首先,这不是分配器,否则您的名称约定错误。在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

© www.soinside.com 2019 - 2024. All rights reserved.