c ++ new和delete

时间:2012-04-06 23:23:12

标签: c++

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

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

3 个答案:

答案 0 :(得分:5)

使用std::string并完成它。

如果不明显,那将解决问题。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

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

您的意思是测试代码(下图)

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

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

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