【问题标题】:Deallocating member pointer释放成员指针
【发布时间】:2015-07-28 02:26:49
【问题描述】:
#include <iostream>

using namespace std;


class myClass{

public:
    char * pointer;
    char * pointerToPointer;

myClass(){
  pointer = new char;
      char x = 'x';
      pointer = &x;

  pointerToPointer = new char[3];
      char y[3] = {'x', 'y', 'z'};
      pointerToPointer = y;
}
~myClass(){
  delete pointer;
  delete[] pointerToPointer;
}};

int main(){
myClass myclass;
return 0;
}

我是 C++ 新手,所以如果这个问题被打死了,我深表歉意,但我似乎无法在网上找到答案。

我试图在我的类中包含两个指针。一个指向单个字母,另一个指向一个字符数组。据我了解,每次包含新关键字时,它都应在代码中的某个位置伴随删除关键字。

我已经包含了一个析构函数,它应该释放分配给这些指针的内存,但是当程序终止时在主函数中调用它时,我只剩下:

`./a.out' 中的错误:munmap_chunk():无效指针:0x00007fffcabc5600 *** 中止(核心转储)

任何关于我应该在谷歌上搜索什么的建议/建议将不胜感激。

【问题讨论】:

    标签: c++ pointers memory dynamic heap-memory


    【解决方案1】:

    下面

      pointerToPointer = new char[3];
      char y[3] = {'x', 'y', 'z'};
      pointerToPointer = y;
    

    您将内存分配给pointerToPointer(第一行),然后让pointerToPointer 指向数组y 的开头(第三行)。当您尝试删除pointerToPointer 时,您实际上是在尝试删除指向非动态数组的指针。这会导致段错误,因为 y 的内存由运行时自动释放,您尝试在析构函数中再次释放它。

    在任何情况下,切换指针以指向其他内存位置都应该小心,因为如果您忘记释放初始分配的内存(在您的情况下为new char[3]),它可能会造成内存泄漏。

    【讨论】:

    • 非常感谢!堆栈分配再次浪费了我一个小时的时间。总有一天我会一劳永逸地解决这个问题。
    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多