【发布时间】:2022-07-11 21:38:20
【问题描述】:
blow 代码中运行时错误背后的确切原因是什么。
#include <iostream>
using namespace std;
int main() {
// your code goes here
int *ptr= new int[10];
for(int i=0;i<10;i++)
ptr[i]=i;
for(int i=0;i<10;i++)
delete &ptr[i] ;
// delete[] ptr;
return 0;
}
我知道如果我们通过 new[] 声明数组,那么我们将不得不通过 delete[] 删除它。 但是在下面的代码中,我们通过ptr[i]到达了单独的内存,那为什么我不能通过delete &ptr[i]一个一个地删除内存呢?在上面的代码中导致分段错误的确切原因是什么?
【问题讨论】:
-
计算您使用
new的次数,delete也是如此。数字应该相同。 -
因为这不是
delete[]的工作方式,它不只是循环遍历每个元素并调用delete,它会一次性删除整个数组。无法从数组中删除单个元素 -
当您使用它时,请观看有关
std::shared_ptr和std::unique_ptr的教程以减少代码中的段错误,除非您正在学习new和delete -
那个 for 循环根本不应该存在。您分配了整数,而不是指向整数的指针。您只需要删除数组。如果你不想被正确的格式所困扰,至少使用像 clang-format 这样的工具来为你做。
-
在您的示例中,您没有一个由 10 个指针组成的数组,而是一个指向一个由 10 个整数组成的数组的指针。无论如何,如果你真的没有的话,不要在 C++ 中使用 new/delete。对于动态数组,C++ 有 std::vector。如果你必须分配内存使用 std::make_unique (或有时 std::make_shared)
标签: c++ memory-leaks segmentation-fault new-operator delete-operator