【发布时间】:2023-04-06 17:58:01
【问题描述】:
我一直在 this page 上查找一些 C++ 内容。
下面是关于复制赋值运算符的示例:
Example5& operator= (const Example5& x) {
delete ptr; // delete currently pointed string
ptr = new string (x.content()); // allocate space for new string, and copy
return *this;
}
到目前为止,这对我来说很清楚,但是文章指出:
甚至更好,因为它的字符串成员不是常量,它可以重新使用相同的字符串对象:
Example5& operator= (const Example5& x) {
*ptr = x.content();
return *this;
}
我不明白为什么需要这样做。第一个示例不正是我们想要实现的吗?:复制 分配内容。为什么要“重用同一个字符串对象”?
【问题讨论】:
-
重复使用同一个对象可以消除不必要的内存释放和分配。
-
删除对象并创建新对象是不必要的开销,因为 ptr 不是 const 您可以修改其内容。你还在抄袭。
-
using namespace std;[...]string* ptr;。这足以让我把这个“教程”扔掉。 -
@uhohsomebodyneedsapupper 这个内存泄漏情况如何?
-
@uhohsomebodyneedsapupper 不,你错了。这段代码很好。您只需将 assign
content()复制到您已经创建的字符串。只要ptr在你的 dtor 中被清理并且std::string的实现是正确的(你猜怎么着,除非你使用一个外来的编译器,这比真的更真实)这里就不会有任何内存泄漏。跨度>