-1

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

  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 上的值,它就会中断。我的 delete[] cmds 中断了,所以我必须将其注释掉。任何帮助将不胜感激。如果人们需要,我会澄清更多的事情。

4

2 回答 2

1

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

于 2012-04-06T07:33:38.680 回答
1

除非您有充分理由不这样做,否则您应该避免使用new[]anddelete[]而是使用std::stringand std::vector。这些为您处理内存管理;并且因此相当容易使用。

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

std::string使内存管理、字符串操作和(结合std::stringstream)字符串格式化变得非常、非常、容易得多。不要试图自己处理内存管理,使用经过充分测试的std::stringstd::vector.

于 2012-04-08T03:11:40.847 回答