C++ 为什么';这不是悬挂的std::弱ptr导致SEGFULT吗?
在下面的代码中,我在作用域中创建了一个C++ 为什么';这不是悬挂的std::弱ptr导致SEGFULT吗?,c++,weak-ptr,C++,Weak Ptr,在下面的代码中,我在作用域中创建了一个共享\u ptr,并将其分配给一个弱\u ptr。为什么在运行代码时我没有得到SEGFAULT,因为wp在范围之外应该是无效的,对吗 namespace { struct Dummy { int x; void foo() { std::cout << "dummy created\n"; } ~Dummy() {
共享\u ptr
,并将其分配给一个弱\u ptr
。为什么在运行代码时我没有得到SEGFAULT,因为wp
在范围之外应该是无效的,对吗
namespace {
struct Dummy {
int x;
void foo() {
std::cout << "dummy created\n";
}
~Dummy()
{
std::cout << "dummy destroyed\n";
}
};
}
TEST(experimental, ptr_test){
std::weak_ptr<Dummy> wp;
{
auto sp = std::make_shared<Dummy>();
wp = sp;
}
wp.lock()->foo();
};
名称空间{
结构虚拟{
int x;
void foo(){
std::cout一般来说,除非您实际使用无效内存执行某些操作,否则不会出现segfault(然后它也不会总是segfault-由硬件向操作系统发送信号,然后由操作系统实际使程序崩溃)如果您在 Foo中设置了 X/CODE >,您可能有更好的机会看到Sebug——但是正如USER(3157112)指出的,C++标准不能保证无效代码的分段错误。 < P>您实际上并没有取消任何内容。如果被锁定的SyrdpPTR是NUL,则锁定方法仍然会返回SyrdypTR。l、 但共享的_ptr也将为null。在本例中,foo不会在我的编译器上崩溃,因为它从未取消引用null指针,但它是未定义的行为,因此您永远不知道会发生什么。但是,bar将始终崩溃,因为它需要取消引用指针才能到达x
发生这种情况的原因是,所有成员函数都编译为普通函数,这些函数将指向对象的指针作为可从函数体访问的第一个参数,如this。如果函数体中没有任何内容取消引用this,则在nullptr上调用此函数可能大部分时间都有效。但不应这样做,将来的编译器更改或另一个体系结构的端口可能会导致此崩溃
#include <iostream>
#include <memory>
struct Dummy {
int x;
Dummy()
: x(10) {
std::cout << "Dummy created" << std::endl;
}
~Dummy() {
std::cout << "Dummy destroyed" << std::endl;
}
void foo() {
std::cout << "foo" << std::endl;
}
void bar() {
std::cout << x << std::endl;
}
};
int main() {
std::weak_ptr<Dummy> wp;
{
auto sp = std::make_shared<Dummy>();
wp = sp;
}
auto locked = wp.lock();
if(locked.get() == nullptr) {
std::cout << "Locked pointer is null" << std::endl;
}
locked->foo(); // Does not crash
((Dummy*)nullptr)->foo(); // Does not crash
locked->bar(); // Will crash
}
#包括
#包括
结构虚拟{
int x;
伪()
:x(10){
STD::CUT C++不保证无效代码会被分割。它是UB去引用空指针。因为“代码> FoO 的定义根本不使用<代码> < <代码>,编译器忽略它。“真的无效”。不是一个有用的表达式。另一个答案更清楚地说明了此代码是否存在segfault。Stack overflow的读者想要的是具体的、信息性的答案,而不是向非技术读者提供的解释。还有“C++不保证存在segfault…”C++不只是保证,它根本没有信号的概念。它可以分段,或出现工作,或召唤。谢谢,我已经更新我的答案,包括和软化我的语言(不,而不是不会)。