把一个指向数组的指针delete[]之后,赋值成为指向另一个更长的数组,然后delete[] 这个指针,是否会造成内存泄漏

发布于 2022-09-03 11:30:09 字数 410 浏览 27 评论 0

int _tmain(int argc, _TCHAR* argv[])
{
    int* p = new int[3]{1, 2, 3};
    int* k = new int[4]{6, 7, 8, 9};

    delete[] p;
    p = k;
    delete[] p;//此处是否会造成内存泄漏?

    return 0;
}

意思就是说,p初始化时指向的是一个长度为3的数组,而p后来指向了k,那么此时再delete[] p的话,是释放3个单位空间还是4个单位空间?假如只释放3个单位,那就内存泄漏了。
或者换一种说法: delete[] 总要知道需要释放的长度吧。这个长度信息,是跟指针p绑在一起的还是和指针指向的这片地址空间绑在一起的?
如果我是语言设计者的话,我会选择后者,不知我想的对不对。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

↘紸啶 2022-09-10 11:30:09

不会,new和delete是处理堆上的内存,堆的管理方式通常会在申请的内存前面加一些关于这块内存的信息,比如长度之类的,所以你new的时候必须指定一个长度,而delete的时候就不需要了,只需要指明是单个还是数组。

感情洁癖 2022-09-10 11:30:09

不会的,具体长度等信息,以及其和指针的关联,都是交由编译器和操作系统完成的,程序员无须关心底层实现。

桃酥萝莉 2022-09-10 11:30:09

不会造成内存泄漏。
p初始化指向一个长度为3的数组,然后再指向长度为4的数组。因为你之前有过一次delete操作,所以不会造成内存的泄漏。这里声明的指针p是存放在栈上的,而new出来的是存放在堆里面的,p里面存储的是你声明的数组的地址,p里面的地址就是你在堆上申请的数组的地址,需要你用delete释放的,不释放会造成内存泄漏。
delete不需要知道数组的具体长度,只需要根据是否是数组而选择delete或者是delete[]就行了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文