我现在正在锻炼,所以我会马上说我不想使用std :: string解决我的问题。
我有一个简单的类,其中包含几个字段,其中有char *文本字段,可以分配,重写或重新分配。
class MyClass
{
private:
char* name;
...
public:
operator char*() const { return name;}
}
我要做的是将隐式转换为char *,以便可以在程序中执行此操作:
Myclass s = "Hello" //allocates 6 bytes and pust a 0-terminated "Hello/0" line into "name"
char* c = s
s = "Hello World" //re-allocates memory, frees previous memory
cout << "Str: " << s << " Char: " << c;
很显然,正如我甚至在测试之前就注意到的那样,当“名称”的重新分配发生并且内存被释放时,“ c”现在指向垃圾。 所以这段代码是行不通的,我完全理解为什么。
我想我可以分配新内存并返回一个指向它的指针:
operator char*() const
{
int length = strlen(name)+1;
char* ptr = new char[length]
std::copy(name, name+length, ptr);
return ptr;
}
但是在这种情况下,如果我以后将“ c”重新分配给其他东西-那么内存将永远不会被释放,对吗?如果我这样做:
c = "Bye";
然后基本上我复制了“名称”的内存将仍然保持分配状态并泄漏?
问题是:如何做到这一点?我是否应该为此担心,还是仅假设重新分配“ c”的用户应首先注意清除内存?
我将重复我的目标,那就是通过内存操作和指针来做到这一点,而不是安全地使用std :: string。 谢谢!