gpt4 book ai didi

c++ - make_shared() 的可调试替代品

转载 作者:太空狗 更新时间:2023-10-29 21:05:42 26 4
gpt4 key购买 nike

使用 gcc 4.6.2,如果构造函数抛出异常,make_shared() 会给出无用的回溯(显然是由于某些重新抛出)。我正在使用 make_shared() 来节省一些输入,但这是显示停止器。我创建了一个替代品 ma​​ke_shrd(),它允许正常的回溯。我正在使用 gdb 7.3.1。

我担心的是:

  1. make_shared() 下的错误回溯不知何故是我自己的错
  2. 我的替代品 make_shrd() 会给我带来一些微妙的问题。

这是一个演示:

#include <memory>
#include <stdexcept>

using namespace std;

class foo1
{
public:
foo1( const string& bar, int x ) :m_bar(bar), m_x(x)
{
throw logic_error( "Huh?" );
}
string m_bar;
int m_x;
};

class foo2
{
public:
foo2( const string& bar, int x ) : m_foo1(bar,x)
{}

foo1 m_foo1;
};

// more debuggable substitute for make_shared() ??
template<typename T, typename... Args>
std::shared_ptr<T> make_shrd( Args... args )
{
return std::shared_ptr<T>( new T(args...));
}

int main()
{
auto p_foo2 = make_shared<foo2>( "stuff", 5 ); // debug BAD!!
// auto p_foo2 = make_shrd<foo2>( "stuff", 5 ); // debug OK
// auto p_foo2 = new foo2( "stuff", 5 ); // debug OK
// auto p_foo2 = shared_ptr<foo2>(new foo2( "stuff", 5 )); // debug OK
return (int)(long int)p_foo2;
}

编译:

g++ -g -std=c++0x -Wall -Wextra main.cpp

调试:

gdb a.out

make_shared() 回溯是垃圾,它不显示异常点的堆栈。所有其他选项都提供了一个合理的回溯。

在此先感谢您的帮助和建议。

最佳答案

您对 make_shrd() 的实现失去了只分配一 block 内存的能力:std::make_shared()做两件事:

  1. 它避免了重复编写类型(如果分配的类型和所需的类型 std::shared_ptr<T> 相同,而不是后者用于基类)
  2. 它将共享对象的分配和对象的描述符合并为一个分配

std::make_shared()的主要目的|实际上是第二个特征。我没有看过实现,但我怀疑这也是实际导致您出现问题的部分。除此之外,我看不出有任何理由说明在您修复参数转发后您的实现会变得更糟:

template<typename T, typename... Args>
std::shared_ptr<T> make_shrd(Args&&... args)
{
return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
}

关于c++ - make_shared() 的可调试替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com