【问题标题】:Reason behind causing runtime error during delete keyword [closed]在删除关键字期间导致运行时错误的原因[关闭]
【发布时间】: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_ptrstd::unique_ptr 的教程以减少代码中的段错误,除非您正在学习 newdelete
  • 那个 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


【解决方案1】:

您创建了一个数组,需要删除一次。

int *ptr= new int[10];
// Do your things with ptr
delete[] ptr;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多