c – 指向数组的简单指针

前端之家收集整理的这篇文章主要介绍了c – 指向数组的简单指针前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码做了什么?
obj *x = new obj[100];
delete x; // Note the omission of []

它只删除数组中的第一个元素吗?

解决方法

即使是未定义的行为,您应该注意到最可能的结果(为了调试这些问题).

当通过新的Object [100]创建数组时,首先分配内存.默认行为(没有覆盖默认分配器)是简单地调用malloc(100 * sizeof(Object)).之后,需要在每个对象大小的区域上调用Object的构造函数.这是一个重要的细节:内存被分配一次,但在100个位置调用构造函数.

当通过malloc分配一个块时,它不能被释放.只有一个空闲的呼叫(阻止)将释放该内存.如果关键字new调用malloc,则C关键字delete在内部调用.所以删除数组的正确方法调用delete []数组.那么,如果你调用delete数组怎么办?可能的答案是,内存将被释放(所有这一切,而不仅仅是第一个元素),但只有一个析构函数将被调用:第一个元素的析构函数.

显然有很多事实要考虑.新的和删除不一定绑定到malloc和free.他们可能使用特定架构或操作系统特有的系统调用. (Windows,特别是在malloc之外有一整套堆管理功能,在C API中是免费的).我简单地展示了malloc和free的示例,因为这是我在逐步执行代码时看到最多的代码.例如,Visual Studio可让您进入新的调用,实际看到新的功能代码. (这是另一个重要的细节,新的和删除只是函数调用,你甚至可以在许多情况下覆盖).

你可以用这个小程序来演示这个概念.只需创建一个Object类,在构造函数输出一些东西,并在析构函数输出其他东西.

int main(int argc,char** argv)
{
    Object* o = new Object[4];
    delete o;
    return 0;
}

我运行它,确定:构造函数被称为4次,析构函数调用一次.

猜你在找的C&C++相关文章