我一直在嘗試對此進行除錯,但沒有任何運氣。我希望能在這里得到一些幫助。如果我的問題不相關或其他問題,我很抱歉,我是新手。
所以基本上我所擁有的是:
#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)”
斷言錯誤的影像
任何幫助將不勝感激,謝謝。
uj5u.com熱心網友回復:
有幾個問題。首先,如果你想從中得到一個 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;
}
輸出為空!這是上述程式的鏈接。
要修復,請執行另外兩件事:一,更改child->parent = NodePtr(this);為以下內容:
child->parent = this->weak_from_this();
此外,將 的型別更改parent為std::weak_ptr<Node<T>>。
std::weak_ptr用于此類問題。它不會影響 的參考計數。std::shared_ptr有關更多資訊,請轉到此處。
PS有關is_block_type的錯誤是由shared_ptr引起的,可能是因為您試圖從原始ptr中獲取shared_ptr。在此處閱讀有關 std::shared_ptr 的更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328470.html
