我正在尝试动态分配新对象。
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打破了所以我必须将其评论出来。任何帮助将不胜感激。如果人们需要,我会澄清更多的事情。
答案 0 :(得分:1)
当您的机器人名称为NULL(nm == NULL
)时,您会分配一个空字符串,但不分配cmds
。因此,您至少应该在该分支中将cmds设置为NULL,或者在if (name && *name != 0)
之前签入析构函数delete [] cmds;
。我会选择第一个选项......
答案 1 :(得分:0)
除非您非常有充分的理由不这样做,否则应避免使用new[]
和delete[]
,而应使用std::string
和std::vector
。这些为您处理内存管理;并因此而易于使用。
std::vector
比手动分配的缓冲区更有用,不仅因为它为您处理内存,而且它仍然与旧的C风格API兼容。在您需要提供const char *
或char *
的情况下,您只需提供&vec[0]
(例如,std::vector
的第一个元素的地址)。
std::string
使内存管理,字符串操作和(与std::stringstream
一起)字符串格式化很多,很多更容易。不要试图自己处理内存管理,使用经过充分测试的std::string
和std::vector
。