c++新建和删除

c++ new and delete

本文关键字:删除 新建 c++      更新时间:2023-10-16

我分配了内存,但当我调用析构函数时,它会给我一个分段错误。这是代码。我用正确的方法释放内存了吗?

class plan {
    char *symbol;
    gro  *grow;
  public:
    plan (int, char[] ); //constructor
    ~plan ( ); //destructor
};
plan::plan (int num_of_sm, char sm[]){
  try {
    symbol = new char [strlen(sm) + 1];
  }
  catch (std::bad_alloc) {
    symbol = NULL;
  }

  if (symbol != NULL) {
    if (sm == NULL) {
      strcpy (symbol, "");
    }
    else {
      strcpy (symbol, sm);
    }
  }
  gro = new grow [num_of_sm]; 
}
plan::~plan( ){
  delete [ ] symbol;
  delete [ ] gro;
}

使用std::string并完成它。

万一它不明显,那就解决问题了。

但是,为了避免一些类似的问题,也为了更多地了解所涉及的问题,请查阅3的规则,或者现在在C++11中所知的5的规则。

内存问题可能非常棘手,因为程序并不总是立即崩溃。例如,如果您删除同一个指针两次,程序可能会继续运行,直到稍后删除时崩溃。如果你在Linux上运行,我建议你运行valgrind(假设安装了它,只需键入valgrind,然后输入正常命令。例如valgrind myprog arg1 arg2

在任何情况下,不要认为问题一定是程序崩溃的地方。请尝试检查任何其他删除/释放语句是否存在问题。你确定num_of_sm是一个合理的值吗?

当我调用析构函数时,它会给我一个分段错误。

你是指的测试代码吗

int main()
{
    plan a_plan(2, "hello");
    a_plan.~plan();
}

如果是这样的话,我认为问题是你删除了两次指针。第一次在计划中::~plan(),第二次在离开main()时。所以,不要调用plan::~plan()。

你应该遵循三条规则(或五条规则),也就是说:如果定义了析构函数,则应该同时定义复制构造函数和赋值运算符。