【问题标题】:pointer function delete? and pointer to pointer crash (c++)指针函数删除?和指向指针崩溃的指针(c++)
【发布时间】:2017-05-01 15:10:03
【问题描述】:

我是 C++ 新手,我使用代码块

1/指向指针的指针

int **pp = new int*;
cout<<*pp<<endl;
{
    int *p = new int;
    pp = &p;
    cout<< *pp<<endl;

}

之后,如果我写 delete pp 我有“.exe 已停止工作”。我想这是因为我尝试删除它指向的引用并且不允许这样做。我让pp 成为?我不能删除吗?如果我要创建大量指向指针的指针,我不会有内存泄漏的风险吗?

1/指针函数删除? 我有:

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

如何释放用于fct_ptr 的指针? 写delete fct_ptr(int_value1, int_value2)够了吗?但我怀疑我的fct_ptr(int_value1, int_value2) 只是一个指针,它通过赋值获得其参数的引用,例如int* a=new int; int*b=a;,所以这意味着ptr 不能以这种方式删除...... 所以如果我多次调用那个 fct 我不会有内存泄漏吗? 我可以写 int* ptr;not int* ptr = new int*; 来解决这个问题。 但我想知道如何在不改变ptr的声明的情况下解决它

伯努瓦。

【问题讨论】:

  • 您的fnc_ptr 错误并产生内存泄漏。您为 ptr 分配了内存,然后通过分配一个新的指针值丢弃了该值,因此永远没有机会释放内存。
  • 当您执行ptr = new ...; ptr = ... 时,您将覆盖new 返回的指针。那是内存泄漏。
  • 这里的任何代码都没有引用。您正在获取变量的地址,这是 C 中完全有效的代码,它不支持引用。你需要一本好书。
  • @elan - 呃,仔细看看 fct_ptr 的签名。
  • @BenoîtLu:您根本不应该使用new,除非您发现自己处于非常特殊的情况,而您还是初学者时甚至还没有接近遇到。使用 std::vectorstd::stringstd::unique_ptr 或 C++ 标准库提供的其他有用类。

标签: c++ function pointers


【解决方案1】:

您只需要确保释放您使用new 分配的所有内存,不用担心指针本身。

因此,对于第一个代码块,当您重新分配 pp 时,您已经分配了第一个对象 (new int*) 的内存泄漏,因为当您分配 pp = &amp;p 时,您可以永远 到达上一个内存对象*pp 指向的内存地址。

规则是,对于每个new,必须有一个delete。所以如果你真的想用T* p = new T声明,你需要把

    int **pp = new int*; //(1)
    {
      int *p = new int; //(2)
      delete pp; //make sure (1) is deallocated, will never be reached otherwise
      pp = &p;
      delete p; //make sure (2) is deallocated, will never be reached otherwise
    }

对于(2),变量p只存在于作用域中,只能通过它到达(2),所以也需要在作用域中删除它。如 cmets 中所述,pp 现在指向未定义的内容。

对于第二种情况,每次调用函数fct_ptr 时,都会在堆栈上分配一个永远不会被释放的int。所以这里的解决方案也是

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    delete ptr;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

当然,如果您从不使用该对象,没有需要为指针所指向的内容分配内存。因此,如果您不打算取消引用 ptr,请在确定它指向某个东西之前写 int* ptr;

【讨论】:

  • 感谢您的详细回答。有趣与否,我从来没有使用过删除指针,我一直认为,确实它正在释放指针指向的内存,但指针也被“删除”了。而且我认为new 只是在准备指针接收一些东西,所以对我来说int* ptr=new int; or int* ptr; int a; ptr=&amp;a 是一样的。
  • 当您使用new 时,您在堆上分配内存,而不是在堆栈上(根据您的第二个示例)。堆栈上的内存会自行清理,但您在堆上分配的所有内容都会在那里,直到您释放它。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多