为什么 weak_ptr 出现分段错误
Why am I getting segmentational fault with weak_ptr
我正在做一个练习来了解共享指针和弱指针。
所以这个例子是 shared_ptr 的循环依赖,我该如何解决 weak_ptr 的问题。
我想将 root->left->parent 初始化为 root,右节点也一样,但它给我分段错误。
有人知道这个问题吗,我应该怎么写和初始化它?
这是我的代码。
只是想知道,我的第一个练习是仅使用共享指针完成所有操作,但之后将父级更改为 weak_ptr,所以这就是为什么有注释行
提前致谢
#include <iostream>
#include <memory>
#include <string>
using namespace std;
struct Node {
string name;
shared_ptr<Node> left = nullptr;
shared_ptr<Node> right = nullptr;
// shared_ptr<Node> parent=nullptr;
weak_ptr<Node> parent;
Node(string x) : name(x) { cout << "Constructor" << name << endl; }
~Node() { cout << "Destructor " << name << endl; }
string toString() {
string lStr{ "<none>" }, rStr{ "<none>" }, pStr{ "<none>" };
if (left != nullptr) lStr = left->toString();
if (right != nullptr) rStr = right->toString();
// if (parent != nullptr) pStr = parent->name;
pStr = parent.lock()->name;
string res;
res += "{Me:" + name + " ";
res += "Parent:" + pStr + " ";
res += "Left:" + lStr + " ";
res += "Right:" + rStr + "}";
return res;
}
};
shared_ptr<Node> foo() {
shared_ptr<Node> root = make_shared<Node>("rootname");
root->left = make_shared<Node>("leftname");
root->right = make_shared<Node>("rightname");
root->left->parent = {root};
root->right->parent ={root};
return root;
}
int main()
{
shared_ptr<Node> k = foo();
cout << k->toString() << endl;
return 0;
}
// if (parent != nullptr) pStr = parent->name;
pStr = parent.lock()->name;
应该是
if (auto parentPtr = parent.lock()) pStr = parentPtr->name;
parent.lock()
可能 return 无效 std::shared_ptr
.
它在这一行崩溃:
pStr = parent.lock()->name;
因为parent
没有为根节点初始化。我不知道你对根项目的逻辑是什么,但你必须检查锁定的结果,如果它无效,请用 pStr 做其他事情。
if (auto res = parent.lock()) {
pStr = res->name;
} else {
pStr = "root";
}
我正在做一个练习来了解共享指针和弱指针。
所以这个例子是 shared_ptr 的循环依赖,我该如何解决 weak_ptr 的问题。
我想将 root->left->parent 初始化为 root,右节点也一样,但它给我分段错误。
有人知道这个问题吗,我应该怎么写和初始化它?
这是我的代码。
只是想知道,我的第一个练习是仅使用共享指针完成所有操作,但之后将父级更改为 weak_ptr,所以这就是为什么有注释行
提前致谢
#include <iostream>
#include <memory>
#include <string>
using namespace std;
struct Node {
string name;
shared_ptr<Node> left = nullptr;
shared_ptr<Node> right = nullptr;
// shared_ptr<Node> parent=nullptr;
weak_ptr<Node> parent;
Node(string x) : name(x) { cout << "Constructor" << name << endl; }
~Node() { cout << "Destructor " << name << endl; }
string toString() {
string lStr{ "<none>" }, rStr{ "<none>" }, pStr{ "<none>" };
if (left != nullptr) lStr = left->toString();
if (right != nullptr) rStr = right->toString();
// if (parent != nullptr) pStr = parent->name;
pStr = parent.lock()->name;
string res;
res += "{Me:" + name + " ";
res += "Parent:" + pStr + " ";
res += "Left:" + lStr + " ";
res += "Right:" + rStr + "}";
return res;
}
};
shared_ptr<Node> foo() {
shared_ptr<Node> root = make_shared<Node>("rootname");
root->left = make_shared<Node>("leftname");
root->right = make_shared<Node>("rightname");
root->left->parent = {root};
root->right->parent ={root};
return root;
}
int main()
{
shared_ptr<Node> k = foo();
cout << k->toString() << endl;
return 0;
}
// if (parent != nullptr) pStr = parent->name;
pStr = parent.lock()->name;
应该是
if (auto parentPtr = parent.lock()) pStr = parentPtr->name;
parent.lock()
可能 return 无效 std::shared_ptr
.
它在这一行崩溃:
pStr = parent.lock()->name;
因为parent
没有为根节点初始化。我不知道你对根项目的逻辑是什么,但你必须检查锁定的结果,如果它无效,请用 pStr 做其他事情。
if (auto res = parent.lock()) {
pStr = res->name;
} else {
pStr = "root";
}