从动态分配的解引用指针默认初始化非const引用函数参数是否会造成内存泄漏?

Does default-initializing a non-const reference function parameter from a dynamically allocated dereferenced pointer create a memory leak?

本文关键字:引用 是否 参数 泄漏 内存 函数 const 动态分配 指针 默认 初始化      更新时间:2023-10-16

我在前面,将不得不处理c++ 98,可能是c++ 03,和c++ 11:

type1 myfunc( type2& var = /*some value of type "type2"*/ )
{
   // Some code
}

我试过了:

type1 myfunc( type2& var = *(new type2) )
{
   // Some code
}

当然它可以工作,但我不确定这是否会造成内存泄漏。这段代码在计算机内存中究竟做了什么?如果我不能这样做,除了重载函数之外,还有其他解决方案吗?

这个问题被标记为c++ 11,所以我想你可以使用std::unique_ptr来解决这个问题。

一个小例子

#include <memory>
#include <iostream>
std::size_t myfunc( std::string const & var
   = * std::unique_ptr<std::string>(new std::string("default string")) )
{ return var.size(); }
int main ()
 {
   std::cout << "default:  " << myfunc() << std::endl;
   std::cout << "argument: " << myfunc("no default") << std::endl;
   return 0;
 }

希望这有帮助。

——增加了C + + 98/c++ 03解决方案——

不清楚OP想用什么语言。

在c++ 98/c++ 03的情况下,可以使用std::auto_ptr代替c++ 11的std::unique_ptr

我记得std::auto_ptr在c++ 11中被弃用了,所以如果你不能使用c++ 11(或更新的标准),只使用

下面的示例应该兼容c++ 98(我也删除了const)

#include <memory>
#include <iostream>
std::size_t myfunc(std::string & var
   = * std::auto_ptr<std::string>(new std::string("default string")) )
{ return var.size(); }
int main ()
 {
   std::string noDef("no default");
   std::cout << "default:  " << myfunc() << std::endl;
   std::cout << "argument: " << myfunc(noDef) << std::endl;
   return 0;
 }

如果你分配了内存而不删除它,那么不管你用解引用、引用或指针操作做了什么恶作剧,你都有内存泄漏。

这段代码将在使用默认参数的情况下创建内存泄漏,除非myfunc释放它(这将是一个hack):

type1 myfunc( type2& var = *(new type2) ) {
   // Some code
   delete &var; // Very bad, don't do it like that.
}

当使用为var指定的参数进行调用时,没有delete就不会有内存泄漏。这是因为编译器看到您正在传递reference形参的实参,而没有分配new type2

创建默认引用而不产生内存泄漏的一种方法是定义一个静态丢弃变量,并将其用作引用:

static type2 throwaway;
type1 myfunc( type2& var = throwaway ) {
    // Some code
}

这样,不需要看到对var所做的修改的调用者将能够调用您的函数而不指定它的引用。当然,如果myfuncvar做了任何修改,调用者将无法看到它们。