【发布时间】:2012-03-04 01:40:55
【问题描述】:
我很喜欢在 C++ 中使用运算符 new 和 delete,但经常在稍后在程序代码中调用 delete 时遇到问题。
例如在下面的代码中:
class Foo {
public:
string *ace;
Foo();
~Foo();
};
Foo::Foo() {
ace = new string;
}
Foo::~Foo() {
delete ace;
}
void UI::ButtonPressed() { //Happens when an event is triggered
Foo *foo = new Foo;
ui->label = ace; //Set some text on the GUI
delete foo; //Calls the destructor, deleting "ace" and removing it from the GUI window
}
我可以声明一个new 字符串,但是当我delete 它时,它会从GUI 表单中删除该值,因为该字符串现在已被删除。
有没有办法让我稍后以某种方式删除这个分配的字符串?
我不想将其声明为全局变量,然后在程序源代码的最后一行将其声明为delete。我永远不能打电话给delete,但据我所知,这很糟糕,会导致内存泄漏。
【问题讨论】:
-
A
std::string可能会有所不同,因此在您的示例中您可以声明std::string ace;并且您可能应该了解有关智能指针等的更多信息。en.wikipedia.org/wiki/Smart_pointer -
您是否知道智能指针是否适用于
QString(QT) 等非标准 C++ 数据类型? -
Qt 也有某种智能指针,是的,
std::smart_ptr等。应该与 Qt 一起使用... -
@user99545:
std::string存在的原因之一是您不必担心newing 和deleteing 字符数组。只要让它成为班级成员,它就会自己照顾自己。 -
¤ 正如@Insilico 所说,
std::string是一种解决方案。std::string让您决定是复制还是共享>数据:你不知道它的作用,你也不需要知道(它在功能上就好像它被复制了一样)。要实现自己的复制,您需要阅读“三法则”以进行适当的破坏。要实现自己的共享,请使用std::shared_ptr。不幸的是,标准库中没有复制智能指针,我认为甚至在 Boost 中也没有。干杯&hth.,
标签: c++ memory-management memory-leaks