调试断言失败 - C++,使用智能指针
Debug assertion failure - C++, using smart pointers
我已经尝试调试它一段时间了,但没有任何运气。我希望在这里得到一些帮助。抱歉,如果我的问题不相关或什么的,我是新人。
基本上我所拥有的是:
#include <iostream>
template<typename T> class Node {
using NodePtr = std::shared_ptr<Node<T>>;
private:
Node() {}
T value{};
NodePtr parent;
NodePtr child;
public:
Node(const T& value) : value{ value } {}
Node(const T& value, NodePtr child) : Node(value)
{
this->child = child;
if (child != NULL)
{
//problem here?
child->parent = NodePtr(this);
/*The equivalent in C# works perfectly fine:*/
/*this.child = child;
if(child != null) {
child.parent = this;
}*/
}
}
const T& Value() const { return value; }
T& ValueRef() const { return value; }
NodePtr Parent() const { return parent; }
NodePtr Child() const { return child; }
};
template<typename T> std::ostream& operator<<(std::ostream& stream, const Node<T>& node) {
stream << "{" << node.Value() << "}";
return stream;
}
int main()
{
Node<int> n{ 5, std::make_shared<Node<int>>(3) };
std::cout << n;
}
我可以在不使用智能指针的情况下轻松实现这一点,但我正在努力学习它们,所以就是这样。
失败的断言:“is_block_type_valid(header->_block_use)”
Image of the assertion error
如有任何帮助,我们将不胜感激。
有一些问题。首先,如果你想从这里得到一个shared_ptr,你必须继承自std::enable_shared_from_this:
template<typename T> class Node : std::enable_shared_from_this<Node<T>> {
// ...
主要问题是有一个 shared_ptr 引用了一个 shared_ptr(父子关系,反之亦然)。但是,shared_ptr 只是引用计数。看看下面的程序:
#include <iostream>
#include <memory>
struct A;
struct B{
std::shared_ptr<A> sp;
~B(){ std::cout << "B destroyed\n"; }
};
struct A{
std::shared_ptr<B> sp;
~A(){ std::cout << "A destroyed\n"; }
};
int main(){
std::shared_ptr<B> b{};
std::shared_ptr<A> a {b->sp};
b = a->sp;
}
输出为空白! Here 是上述程序的 link。
要修复,请执行另外两件事:第一,将 child->parent = NodePtr(this);
更改为以下内容:
child->parent = this->weak_from_this();
此外,将 parent
的类型更改为 std::weak_ptr<Node<T>>
。
std::weak_ptr
用于此类问题。它不影响 std::shared_ptr
的引用计数。有关详细信息,请转至 here.
P.S。关于 is_block_type 的错误是由 shared_ptr 引起的,可能是因为您试图从原始 ptr 获取 shared_ptr。阅读更多关于 std::shared_ptr here.
我已经尝试调试它一段时间了,但没有任何运气。我希望在这里得到一些帮助。抱歉,如果我的问题不相关或什么的,我是新人。
基本上我所拥有的是:
#include <iostream>
template<typename T> class Node {
using NodePtr = std::shared_ptr<Node<T>>;
private:
Node() {}
T value{};
NodePtr parent;
NodePtr child;
public:
Node(const T& value) : value{ value } {}
Node(const T& value, NodePtr child) : Node(value)
{
this->child = child;
if (child != NULL)
{
//problem here?
child->parent = NodePtr(this);
/*The equivalent in C# works perfectly fine:*/
/*this.child = child;
if(child != null) {
child.parent = this;
}*/
}
}
const T& Value() const { return value; }
T& ValueRef() const { return value; }
NodePtr Parent() const { return parent; }
NodePtr Child() const { return child; }
};
template<typename T> std::ostream& operator<<(std::ostream& stream, const Node<T>& node) {
stream << "{" << node.Value() << "}";
return stream;
}
int main()
{
Node<int> n{ 5, std::make_shared<Node<int>>(3) };
std::cout << n;
}
我可以在不使用智能指针的情况下轻松实现这一点,但我正在努力学习它们,所以就是这样。
失败的断言:“is_block_type_valid(header->_block_use)”
Image of the assertion error
如有任何帮助,我们将不胜感激。
有一些问题。首先,如果你想从这里得到一个shared_ptr,你必须继承自std::enable_shared_from_this:
template<typename T> class Node : std::enable_shared_from_this<Node<T>> {
// ...
主要问题是有一个 shared_ptr 引用了一个 shared_ptr(父子关系,反之亦然)。但是,shared_ptr 只是引用计数。看看下面的程序:
#include <iostream>
#include <memory>
struct A;
struct B{
std::shared_ptr<A> sp;
~B(){ std::cout << "B destroyed\n"; }
};
struct A{
std::shared_ptr<B> sp;
~A(){ std::cout << "A destroyed\n"; }
};
int main(){
std::shared_ptr<B> b{};
std::shared_ptr<A> a {b->sp};
b = a->sp;
}
输出为空白! Here 是上述程序的 link。
要修复,请执行另外两件事:第一,将 child->parent = NodePtr(this);
更改为以下内容:
child->parent = this->weak_from_this();
此外,将 parent
的类型更改为 std::weak_ptr<Node<T>>
。
std::weak_ptr
用于此类问题。它不影响 std::shared_ptr
的引用计数。有关详细信息,请转至 here.
P.S。关于 is_block_type 的错误是由 shared_ptr 引起的,可能是因为您试图从原始 ptr 获取 shared_ptr。阅读更多关于 std::shared_ptr here.