释放在函数重载操作符中分配的内存
Where to free the memory allocated in functions overloading operator
我试图学习基本的c++操作符重载概念。我有一个类mystring和相关的代码如下所示。在用于重载'+'操作符的函数中,我可以在哪里释放内存以避免内存泄漏。
#include <iostream>
class mystring
{
char *ptr;
public:
mystring(char *str = "")
{
ptr = new char[strlen(str) + 1]
strcpy(ptr,str);
}
mystring operator +(mystring s)
{
char *str = new char[strlen(ptr) + strlen(s.ptr) + 1];//where should this memory be freed
strcpy(str,ptr);
strcat(str,s.ptr);
return mystring v1(str);
}
~mystring()
{
delete [] ptr;
}
};
int main()
{
mystring a="Hello",b="World",c;
c = a + b;
}
简单修复:
mystring operator +(mystring s)
{
char *str = new char[strlen(ptr) + strlen(s.ptr) + 1];//where should this memory be freed
strcpy(str,ptr);
strcat(str,s.ptr);
mystring v1(str);
delete[] str;
return v1
}
或者有一个私有构造函数
MyStr(char *str, bool dummy)
{
ptr = str;
}
然后....strcat().
mystring v1(str, false);
return v1;
您的连接操作符将有与赋值操作符相同的问题,因此这将是一个有用的读取:http://www.parashift.com/c++-faq-lite/assignment-operators.html
- 为新的大字符串分配内存,将strcpy/cat放入其中,删除旧str指针的内存,然后将成员str赋值给指向新创建的大字符串
内存应该在mystring的析构函数中释放,但是您需要重新考虑一下您的设计。
mystring operator +(mystring s)
{
mystring result;
result.ptr = new char[strlen(ptr) + strlen(s.ptr) + 1];
strcpy(result.ptr,ptr);
strcat(result.ptr,s.ptr);
return result;
}
注意,您需要一个默认构造函数来创建空字符串。此外,还必须处理ptr资源,并添加适当的复制构造函数、赋值操作符和析构函数。除此之外,你应该通过const&来获取你的参数。此外,+运算符更好地实现为自由函数;作为友元或基于成员+=操作符
我明白练习的目的只是为了学习。在现实生活中,我会避免创建这样的字符串类型。现在回到原来的问题,解决方法是总是使用RAII管理资源,可以以不同的方式完成,但是一个最简单的一个是使用 copy-and-swap 与规则三(我写了,就在几天前在这里使用RAII管理的资源意味着随时意味着你不需要认为太难如何以及何时你必须释放他们。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?