【发布时间】:2010-04-16 16:01:44
【问题描述】:
编辑:我知道在这种情况下,如果它是一个实际的类,我最好不要将字符串放在堆上。但是,这只是一个示例代码,以确保我理解理论。实际代码将是一棵红黑树,所有节点都存储在堆上。
在继续之前,我想确保我有正确的这些基本想法(我来自 Java/Python 背景)。我一直在网上搜索,但还没有找到这个问题的具体答案。
当你重新分配一个指向新对象的指针时,你是否必须先对旧对象调用 delete 以避免内存泄漏?我的直觉告诉我是的,但在继续之前我想要一个具体的答案。
例如,假设您有一个存储指向字符串的指针的类
class MyClass
{
private:
std::string *str;
public:
MyClass (const std::string &_str)
{
str=new std::string(_str);
}
void ChangeString(const std::string &_str)
{
// I am wondering if this is correct?
delete str;
str = new std::string(_str)
/*
* or could you simply do it like:
* str = _str;
*/
}
....
在 ChangeString 方法中,哪个是正确的?
如果您不使用 new 关键字作为第二种方式,我想我会挂断电话,它仍然会像您预期的那样编译和运行。这会覆盖这个指针指向的数据吗?还是做其他事情?
任何建议都会非常有用:D
【问题讨论】:
-
您很可能一开始就不应该分配带有
new的字符串。你有什么具体原因吗? -
这里更自然的做法仍然是:
*str = _str;(如果您只想分配内容,无需丢弃一个字符串并创建另一个字符串) -
这几乎就是我的问题的中心。如果我这样做,我会有内存泄漏吗?从下面的 cmets 中,听起来我会的。
-
如果你想要ared-black树,std::map有什么问题?
-
@neil,红黑树的全部目的只是让我了解语言/语法/等。每次我学习一门新语言时,我都会先构建一棵红黑树,以确保我了解基础知识(这几乎是我的“hello world”)
标签: c++ memory-management pointers