我有一个类,我希望能够在其中设置一个标志,说它是否是堆分配的,以便它可以在其自身之后正确清理,而不是尝试将其删除(如果在堆栈中)。问题是...我似乎无法同时覆盖new和构造函数。因此,它从设置new标志的isHeapAllocated重载开始,然后进入重置该标志的构造函数。

void* String8::operator new(size_t size)
{
    String8* string = (String8*)malloc(size);
    if(string == null)
        Exception("allocation fail : no free memory");
    string->isHeapAllocated = true;
    return string;
}

String8::String8()
{
    isHeapAllocated = false;
}

因此,new String8()设置isHeapAllocated标志,然后将其重置为false。有什么办法吗?

最佳答案

它不会按预期工作:

新的运算符返回要分配给构造函数的统一内存。
您-正确-做了String8* string = (String8*)malloc(size);,但是*string,在这个阶段还不是String8对象:只是包含它的内存容量。

因此string->isHeapAllocated = true;实际上在尚未构造的对象(即UB)中设置了一个标志。

承认这一点不会损害OS进程,因此程序不会崩溃(毕竟,您已经写了属于您的内存...),当您稍后执行String8* ptr = new String8;之类的操作时,在新返回String8::之后,将调用String8构造函数,并且该成员将独立于您在新运算符重载中所做的操作而独立地设置回“false”。

管理C++对象的惯用方式是让谁负责分配。
(如果“谁”是堆栈,则按照定义执行该操作)。

09-07 09:44