-4

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

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;
}
4

3 回答 3

5

使用std::string并完成它。

以防万一不明显,这将解决问题。

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

于 2012-04-06T23:52:21.770 回答
0

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

无论如何,不​​要假设问题一定是程序崩溃的地方。尝试检查任何其他删除/释放语句是否存在问题。您还确定 num_of_sm 是一个合理的值吗?

于 2012-04-07T01:45:13.253 回答
0

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

你的意思是测试代码吗(下面)

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

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

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

于 2012-04-07T02:48:19.587 回答