从动态分配的解引用指针默认初始化非const引用函数参数是否会造成内存泄漏?
Does default-initializing a non-const reference function parameter from a dynamically allocated dereferenced pointer create a memory leak?
我在前面,将不得不处理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
所做的修改的调用者将能够调用您的函数而不指定它的引用。当然,如果myfunc
对var
做了任何修改,调用者将无法看到它们。
相关文章:
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 形成对对象的引用是否构成访问?
- C++ 引用是否在需要时隐式转换为值?
- 右值引用是否具有与右值引用相同的开销?
- 返回引用是否也会延长其生存期?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- 强制转换为指针引用是否会导致未定义的行为
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 结构化绑定和转发引用是否混合良好?
- 此常量引用是否保留了其生命?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 在 C++ 中更改越界指针的取消引用是否安全?
- 本地引用是否由"DetachCurrentThread"清除?
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 常量右值引用是否允许对编译器进行额外优化?
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 返回强制引用是否安全