C++内存分配 new[] 和删除 []
C++ Memory Allocation new[] and delete[]
我正在尝试动态分配一个新对象。
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::string
和 std::vector
。这些为您处理内存管理;因此,使用起来相当容易。
std::vector
比手动分配的缓冲区有用得多,不仅因为它为您处理内存,而且它仍然与较旧的 C 样式 API 兼容。在需要提供const char *
或char *
的情况下,您可以简单地提供&vec[0]
(例如,std::vector
的第一个元素的地址)。
std::string
使内存管理,字符串操作和(与std::stringstream
一起)字符串格式化变得更加容易。 不要试图自己处理内存管理,使用经过良好测试的std::string
和std::vector
。
相关文章:
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 删除使用 new 创建的 2D 或 3D 指针
- 使用new时如何重新分配dyyanmic数组,不使用realloc删除C++?
- 从主函数中删除在另一个函数中使用 new 创建的一系列对象
- 重载运算符 new/new[] 删除/删除[] 全局C++
- C++删除运算符而不"new"
- C++ 删除"new"?
- 继承类上的运算符new和delete.操作员删除未执行
- 为什么当我使用"new"关键字声明数组指针时无法删除它
- Valgrind在说new的行中看到了删除
- 为什么当我尝试对使用 New 函数启动的对象调用删除函数时出现范围错误?
- 使用删除 [] 删除由 new [] 创建的数组
- 将 new[] 创建的对象传递给类,析构函数以进行必要的删除
- p = new String [0]和p = new Int [0]之后,为什么当删除[] p时字符串版本崩溃
- C++内存 - 是否需要删除使用 'new' 创建的基元类型变量?
- 如何将'malloc'和'free'替换为'new'和"删除"?
- 通过传递外部指针或内部调用 new 构造的类,我可以在销毁时天真地删除这个指针吗?
- 我是否必须删除我分配的wchar_t new
- 当链表节点是用"new"构造时,如何删除列表?
- 删除 new 在回调函数中创建的指针