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

C++ Memory Allocation new[] and delete[]

本文关键字:删除 new 内存 分配 C++      更新时间:2023-10-16

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

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

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

除非你有很好的理由不这样做,否则你应该避免使用 new[]delete[],而是使用 std::stringstd::vector 。这些为您处理内存管理;因此,使用起来相当容易。

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

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