c++ - 编译器如何知道使用哪个运算符或函数分配了哪个内存?

标签 c++ memory-management malloc new-operator

假设我为两个数组分配了内存,一个使用 new 运算符,另一个使用 malloc 函数。据我所知,这两个内存都是在堆段中分配的,那么我的问题是编译器如何知道使用哪个运算符或函数分配了哪个内存?或者这背后有什么其他的概念。

最佳答案

编译器不必知道指针后面的内存是如何分配的,这是程序员的责任。您应该始终使用匹配的分配-解除分配函数/运算符。例如,operator new 可以重载。在这种情况下,当你用 new 分配对象,然后用 free() 释放它时,你就有麻烦了,因为 free() 不知道你在那里有什么样的簿记。下面是这种情况的简化示例:

#include <iostream>
#include <stdlib.h>


struct MyClass
{
    // Really dumb allocator.
    static void* operator new(size_t s)
    {
        std::cout << "Allocating MyClass " << s << " bytes.\n";
        void* res = Pool + N * sizeof(MyClass);
        ++N;
        return res;
    }

    // matching operator delete not implemented on purpose.

    static char Pool[]; // take memory from this statically allocated array.
    static unsigned N; // keep track of allocated objects.
};

char MyClass::Pool[10*sizeof(MyClass)];
unsigned MyClass::N = 0;

int main(int argc, char** argv)
{
    MyClass* p = new MyClass();

    if (argc == 1)
    {
        std::cout << "Trying to delete\n";
        delete p; // boom - non-matching deallocator used.
    }
    else
    {
        std::cout << "Trying to free\n";
        free(p); // also boom - non-matching deallocator used.
    }
}

如果您混合搭配分配器和释放器,您将遇到类似的问题。

关于c++ - 编译器如何知道使用哪个运算符或函数分配了哪个内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909711/

相关文章:

窗口内的 C++ CPU 图形

memory-management - 如果访问X86系统中不存在的物理地址怎么办?

php - 如何获得可供 PHP 使用的内存

我可以用 malloc 和隐式转换替换对 open_memstream 的调用吗?

c - 执行 malloc() 期间的 EXC_BAD_ACCESS (KERN_INVALID_ADDRESS)

c++ - 如何通过变量值获取最小值组?

c++ - 随机抽出的 4 张牌至少有一张是 A

c++ - 非模板类的构造函数中的模板参数

c++ - 获取 std::bad_alloc 错误;如何交叉验证操作系统是否真的内存不足

c - 在动态分配的二维数组上使用 realloc() 是个好主意吗?