分配给取消引用的字符串--这会导致内存泄漏吗? C++。以下情况是否会导致内存泄漏 // debug is optional, for debugging purposes. // Say my_string is an internal string class my company uses. int DoSomething(my_string *debug) { const my_string& s = GetString(); if (debug != nullptr) *debug = s; // Could this cause a memory leak? return DoSomethingElse(s); }

分配给取消引用的字符串--这会导致内存泄漏吗? C++。以下情况是否会导致内存泄漏 // debug is optional, for debugging purposes. // Say my_string is an internal string class my company uses. int DoSomething(my_string *debug) { const my_string& s = GetString(); if (debug != nullptr) *debug = s; // Could this cause a memory leak? return DoSomethingElse(s); },c++,memory-management,memory-leaks,C++,Memory Management,Memory Leaks,我想在这里检查一下我的理解:我认为在注释行中,debug指向的内存区域将被s的内容(副本)覆盖,除非有一个为my_string实现的复制构造函数,在这种情况下,它可能也会做一些其他事情 如果my_string没有特殊的复制构造函数,那么如果my_string在其内部表示中指向任何动态分配的内存(可能是这样的,因为它可以容纳任何长度的字符串),那么上述代码将导致内存泄漏 另外,关于预期C++的“礼仪”的另一个问题,我应该假设,无论是谁写的“代码> MySythStudio”都写了一个拷贝构造函数,

我想在这里检查一下我的理解:我认为在注释行中,
debug
指向的内存区域将被
s
的内容(副本)覆盖,除非有一个为
my_string
实现的复制构造函数,在这种情况下,它可能也会做一些其他事情

如果
my_string
没有特殊的复制构造函数,那么如果
my_string
在其内部表示中指向任何动态分配的内存(可能是这样的,因为它可以容纳任何长度的字符串),那么上述代码将导致内存泄漏

另外,关于预期C++的“礼仪”的另一个问题,我应该假设,无论是谁写的“代码> MySythStudio”都写了一个拷贝构造函数,以避免这种情况下的内存泄漏。也就是说,由于我自己的代码中没有任何
新的
,如果该代码导致内存泄漏,是否可以合理地说这不是我的“错误”


编辑:我想可能我指的是上面的复制赋值运算符而不是复制构造函数。

是的,这是你的错,使用你知道的坏代码总是你的错。修复它或用大量的评论来解决它,但千万不要假装这是别人的问题

代码没有泄漏,但可能会崩溃

发生的情况是,返回一个指向字符串的指针,但当您离开函数时,原始字符串内存被删除。现在,通常内存在短时间内保持不变,但迟早(通常更快)会有其他东西使用字符串所占用的内存,而你得到的最多是垃圾,最坏的是崩溃

您将注意到,从GetString返回的my_字符串可能会创建一个临时副本(您还没有显示代码),因此s将指向这个临时对象。如果GetString返回一个指向原始字符串的指针,那么您的处境就更安全了,但现在您将任由拥有GetString返回的原始字符串的人摆布


返回一个被复制的字符串对象并返回副本(编译器将对此进行很好的优化,以便获得最少的内存副本),或者返回一个共享的ptr,以便更好地处理所有权。

这在理论上可能是内存泄漏。然而,无论何时编写一个内部管理任何类型资源的类(我们经常这样做),都要尊重和支持它。我的意思是,如果编写
my_string
类的人是正常的,他们会显式地定义copy操作符,这样就不会发生泄漏


另外,如果您不完全理解复制构造函数和复制运算符之间的区别,可能会有所帮助。

答案完全取决于
my\u string operator=(const my\u string&s)
的作用。如果它们引用您创建的本地临时字符串所拥有的内存,那就是它们的错误。如果你知道的话,还有你的。在这种情况下,它可能会崩溃

另一方面,如果他们对传递给
operator=
的字符串进行深度复制,则一切正常,当本地字符串超出范围时,一切正常


您不应该担心内存泄漏,而应该担心字符串
debug

my_string
中可能存在的悬空指针,最好有一组单元测试来验证它是否泄漏,以及使用它的一个非常好的理由,而不是
std::string
。当然,这可能会泄漏
my_string
太糟糕了。最后,如果你知道它很烂,不管怎么用,那么是的,可以说这仍然是你的错。也许是,也许不是。这取决于这里没有显示的代码。@WhozCraig@juanchopanza它是否只取决于
my_string
的实现,还是取决于
GetString
DoSomethingElse