c++ - delete 如何区分内置数据类型和用户定义的数据类型?

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

如果我这样做:

// (1.)
int* p = new int;
//...do something
delete p;

// (2.)
class sample
{
public:
sample(){}
~sample(){}
};
sample* pObj = new sample;
//...do something
delete pObj;

那C++编译器怎么知道delete后面的对象是内置数据类型还是类对象呢?

我的另一个问题是,如果我 new 一个指向 int 数组的指针,然后我 delete [] 那么如何编译器知道要取消分配的内存块的大小吗?

最佳答案

  1. 编译器知道指向对象的类型,因为它知道指针的类型:

    • p 是一个 int*,因此指向的对象将是一个 int
    • pObj 是一个 sample*,因此指向的对象将是一个 sample
  2. 编译器不知道您的 int* p 是指向单个 int 对象还是数组(int[N]).这就是为什么 必须记住对数组使用delete[] 而不是delete

    要取消分配的内存块的大小,最重要的是,要销毁的对象的数量是已知的,因为 new[] 将它们存储在某个地方,而 delete[] 知道在哪里检索这些值。 This question from C++ FAQ Lite展示了实现 new[]delete[] 的两种常用技术。

关于c++ - delete 如何区分内置数据类型和用户定义的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347823/

相关文章:

c++ - 列出名为 boost 的托管共享内存的名称

c++ - 通过基本引用进行分配的对象切片是否定义良好?

c - 找不到新行时 fgets 不返回 NULL

javascript - 什么是 new function(settings){...}(jQuery.query || {});在javascript中是什么意思?

c++ - 在 Windows 上与 USB HID 设备进行通信的最佳 USB 库是什么?

c++ - 是否有 QPair 类,但用于三个以上的项目而不是两个?

c++ - 使用重载放置新/删除提升 shared_ptr

ios - 在出现内存警告后,如何重新加载 Storyboard 中内置的 uisearchDisplayController?

python 在磁盘上存储实时变量

c++ - 当分配返回 0 时,带有空异常规范调用构造函数的 operator new