悬挂指针和分段错误
Dangling pointer and segmentation fault
这是一个示例代码:
class IntWrapper
{
public:
IntWrapper(int value_ = 0): value(value_) {}
int getNumber()
{
return value;
}
void setNumber(int value_)
{
value = value_;
}
private:
int value;
};
class T
{
public:
T(){}
void test()
{
std::cout << ptr->getNumber() << std::endl;
ptr->setNumber(10);
std::cout << ptr->getNumber() << std::endl;
}
private:
IntWrapper *ptr;
};
int main( int argc, char* argv[] )
{
T t;
t.test(); // may cause segmentation fault
return 0;
}
ptr 这是一个悬挂指针。当我 运行 该程序打印时:
1
10
但它也可能导致分段错误(即使只有一个读取内存的函数 - getNumber 被调用)。
- 当ptr指向的内存位置没有被其他对象(程序)分配时,就没有段错误,对吧?怎么解释?
由于 ptr 从未被初始化,它可能指向任何东西——代码、数据、堆栈、未映射的内存、已映射但不在使用范围内的内存。也就是说,ptr 成员变量中的地址可能包含随机剩余数据、编译器或堆实现生成的特殊值,或者 ???
在大多数情况下,推理在这些情况下出现或未出现分段错误的原因并不是特别有用或有意义。只是不要那样做。它是 "undefined behavior" 并且可能导致任意不可预测的事情发生。
这是一个示例代码:
class IntWrapper
{
public:
IntWrapper(int value_ = 0): value(value_) {}
int getNumber()
{
return value;
}
void setNumber(int value_)
{
value = value_;
}
private:
int value;
};
class T
{
public:
T(){}
void test()
{
std::cout << ptr->getNumber() << std::endl;
ptr->setNumber(10);
std::cout << ptr->getNumber() << std::endl;
}
private:
IntWrapper *ptr;
};
int main( int argc, char* argv[] )
{
T t;
t.test(); // may cause segmentation fault
return 0;
}
ptr 这是一个悬挂指针。当我 运行 该程序打印时:
1
10
但它也可能导致分段错误(即使只有一个读取内存的函数 - getNumber 被调用)。
- 当ptr指向的内存位置没有被其他对象(程序)分配时,就没有段错误,对吧?怎么解释?
由于 ptr 从未被初始化,它可能指向任何东西——代码、数据、堆栈、未映射的内存、已映射但不在使用范围内的内存。也就是说,ptr 成员变量中的地址可能包含随机剩余数据、编译器或堆实现生成的特殊值,或者 ???
在大多数情况下,推理在这些情况下出现或未出现分段错误的原因并不是特别有用或有意义。只是不要那样做。它是 "undefined behavior" 并且可能导致任意不可预测的事情发生。