- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在调试一些代码,我遇到了这个崩溃的片段,问题是单例指针和本地指针不是同一个地址。我不确定这是为什么。
代码大致是这样的:
class B;
class I_A : public std::enable_shared_from_this<I_A> {
public:
virtual std::shared_ptr<B> make() = 0;
};
class A : public I_A {
public:
std::shared_ptr<B> make() override {
return std::make_shared<B>(shared_from_this());
}
};
static std::shared_ptr<I_A> getInstance() {
static std::shared_ptr<I_A> ptr;
if(!ptr) {
std::cout << "Making new instance\n";
ptr = std::make_shared<A>();
}
std::cout << "Ptr is " << ptr << '\n';
return ptr;
}
class B {
public:
B(const std::shared_ptr<I_A>& ptr) : ptr(ptr) {
std::cout << "In B() " << ptr << '\n';
}
void foo() {
std::cout << "B::ptr " << ptr << '\n';
assert(ptr == getInstance());
}
private:
const std::shared_ptr<I_A>& ptr; // Potential problem here
};
int main() {
auto bPtr = getInstance()->make();
bPtr->foo();
}
但如果我存储 shared_ptr<I_A>
的拷贝在 B 而不是存储 ref,一切正常。
如果我的理解是正确的,单例不应该改变地址,但是B::ptr
和 getInstance()
有不同的地址。
知道这是为什么吗?
最佳答案
你应该(大约)永远使用const std::shared_ptr<T>&
, 对于任何 T
.只需使用 std::shared_ptr<T>
.你会用T * const &
吗? ?
您观察到的问题是 std::shared_ptr<I_A>
的实例你从A::shared_from_this()
得到的是临时的,到您可以使用 B
时它已不复存在.然后,您使用具有未定义行为的悬空引用。
关于c++ - 在类中存储单例指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52953154/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!