加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 指向数组的简单指针

发布时间:2020-12-16 03:12:45 所属栏目:百科 来源:网络整理
导读:以下代码做了什么? obj *x = new obj[100];delete x; // Note the omission of [] 它只删除数组中的第一个元素吗? 解决方法 即使是未定义的行为,您应该注意到最可能的结果(为了调试这些问题). 当通过新的Object [100]创建数组时,首先分配内存.默认行为(没
以下代码做了什么?
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次,析构函数被调用一次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读