C ++内存分配新[]和删除[]

时间:2012-04-06 07:22:46

标签: c++ memory allocation

我正在尝试动态分配新对象。

  int len = (nm == NULL) ? 0 : strlen(nm);

try {
  name = new char[len + 1];
}
catch(std::bad_alloc) {
  name = NULL;
}
if(name) {
    if(nm == NULL)
        strcpy(name, "");
    else
    {
        strcpy(name, nm);
        cmds=new command [num_of_cmds];

然后我的析构函数通过

删除它们
robot::~robot()
{
if (name) {
    delete[] name;
}
delete [] cmds;
} 

我一直遇到分段错误,如果我编辑一些代码来初始化一个简单的int上的值,它就会中断。我的删除[] cmds打破了所以我必须将其评论出来。任何帮助将不胜感激。如果人们需要,我会澄清更多的事情。

2 个答案:

答案 0 :(得分:1)

当您的机器人名称为NULL(nm == NULL)时,您会分配一个空字符串,但分配cmds。因此,您至少应该在该分支中将cmds设置为NULL,或者在if (name && *name != 0)之前签入析构函数delete [] cmds;。我会选择第一个选项......

答案 1 :(得分:0)

除非您非常有充分的理由不这样做,否则应避免使用new[]delete[],而应使用std::stringstd::vector。这些为您处理内存管理;并因此而易于使用。

std::vector比手动分配的缓冲区更有用,不仅因为它为您处理内存,而且它仍然与旧的C风格API兼容。在您需要提供const char *char *的情况下,您只需提供&vec[0](例如,std::vector的第一个元素的地址)。

std::string使内存管理,字符串操作和(与std::stringstream一起)字符串格式化很多,很多更容易。不要试图自己处理内存管理,使用经过充分测试的std::stringstd::vector