在最近的一次错误搜索中,我发现返回指向临时变量成员的指针存在问题。有问题的(简化的)代码是:structS{S(inti):i(i){}inti;int*ptr(){return&i;}};int*fun(inti){returnS(i).ptr();}//temporarySdiesbutpointerlivesonintmain(){int*p=fun(1);return*p;//undefined}如何预防?GCC和Clang有-Waddress-of-temporary和-Wreturn-stack-address但由于ptr()的作用,它们似乎松散了踪迹作为肮脏行为的中间人。
这是悬空指针|引用示例:#include#include#includestd::stringfoo(){return"test";}intmain(){std::string_viewbar=foo();//barispointedtodestructedstringstd::cout地址清理程序无法捕获它,至少使用默认选项。是否可以使用地址清理程序捕获此类错误?更新。报告了这个错误:https://bugs.llvm.org/show_bug.cgi?id=35285https://github.com/google/sanitizers/issues/879
这是悬空指针|引用示例:#include#include#includestd::stringfoo(){return"test";}intmain(){std::string_viewbar=foo();//barispointedtodestructedstringstd::cout地址清理程序无法捕获它,至少使用默认选项。是否可以使用地址清理程序捕获此类错误?更新。报告了这个错误:https://bugs.llvm.org/show_bug.cgi?id=35285https://github.com/google/sanitizers/issues/879
inlinevoidmy_assert(boolcond,conststd::exception&e=my_assert_failed()){if(!cond)throwe;}该标准确保:Atemporaryboundtoareferenceparameterinafunctioncall(5.2.2)persistsuntilthecompletionofthefullexpressioncontainingthecall.对于抛出的临时对象:Thetemporarypersistsaslongasthereisahandlerbeingexecutedforthatexceptio
inlinevoidmy_assert(boolcond,conststd::exception&e=my_assert_failed()){if(!cond)throwe;}该标准确保:Atemporaryboundtoareferenceparameterinafunctioncall(5.2.2)persistsuntilthecompletionofthefullexpressioncontainingthecall.对于抛出的临时对象:Thetemporarypersistsaslongasthereisahandlerbeingexecutedforthatexceptio
在templateTconst&foo(Tconst&dflt){return/*...*/?/*...*/:dflt;}intx=foo(5);在分配给x之前,对临时“生存”的引用是否存在?(我知道它在foo()调用期间仍然存在,但分配让我犹豫)有问题的代码在此处依赖const引用有一些合法用途,即我需要两个单独的函数Tconst&foo_cr(Tconst&dflt);Tconst&foo_v(Tdflt);我想避免(仅仅依赖同名的不同签名对我来说似乎有点冒险。) 最佳答案 Doesthereferencetotemporary
在templateTconst&foo(Tconst&dflt){return/*...*/?/*...*/:dflt;}intx=foo(5);在分配给x之前,对临时“生存”的引用是否存在?(我知道它在foo()调用期间仍然存在,但分配让我犹豫)有问题的代码在此处依赖const引用有一些合法用途,即我需要两个单独的函数Tconst&foo_cr(Tconst&dflt);Tconst&foo_v(Tdflt);我想避免(仅仅依赖同名的不同签名对我来说似乎有点冒险。) 最佳答案 Doesthereferencetotemporary
基本原理我尽量避免在C++代码中进行赋值完全。也就是说,我只使用初始化,并尽可能将局部变量声明为const(即,总是除了循环变量或累加器)。现在,我发现了一个不起作用的案例。我相信这是一种普遍模式,但特别是在以下情况下会出现:问题描述假设我有一个程序将输入文件的内容加载到字符串中。您可以通过提供文件名(toolfilename)或使用标准输入流(catfilename|tool)来调用该工具。现在,如何初始化字符串?以下操作无效:boolconstuse_stdin=argc==1;std::stringconstinput=slurp(use_stdin?static_cast(st
基本原理我尽量避免在C++代码中进行赋值完全。也就是说,我只使用初始化,并尽可能将局部变量声明为const(即,总是除了循环变量或累加器)。现在,我发现了一个不起作用的案例。我相信这是一种普遍模式,但特别是在以下情况下会出现:问题描述假设我有一个程序将输入文件的内容加载到字符串中。您可以通过提供文件名(toolfilename)或使用标准输入流(catfilename|tool)来调用该工具。现在,如何初始化字符串?以下操作无效:boolconstuse_stdin=argc==1;std::stringconstinput=slurp(use_stdin?static_cast(st
曾几何时,我认为这样的代码会失败:constMyClass&obj=MyClass();obj.DoSomething();因为MyClass对象将在其完整表达式结束时被销毁,留下obj作为悬空引用。但是,我(在这里)了解到这不是真的。该标准实际上有一个特殊规定,允许const引用使临时对象保持事件状态,直到所述引用本身被销毁。但是,需要强调的是,只有const引用具有这种能力。今天我在VS2012中运行了下面的代码作为实验。structFoo{Foo(){std::cout调用f()时的输出是:ctorHelloworlddtor所以我查看了C++11草案标准,但只发现了这个(第12