C++ 指向被摧毁的物体
为什么这样的行为是允许的C++ 指向被摧毁的物体,c++,C++,为什么这样的行为是允许的 class A { public: void print() { cout << ++x; } private: int x = 10; }; int main() { A* ptr; int* ptr2; { A a; ptr = &a; int b = 10; ptr2 = &b; } ptr->print(
class A {
public:
void print() { cout << ++x; }
private:
int x = 10;
};
int main() {
A* ptr;
int* ptr2;
{
A a;
ptr = &a;
int b = 10;
ptr2 = &b;
}
ptr->print();
cout << ++*ptr2;
}
A类{
公众:
void print(){cout print();
库特
为什么这样的行为是允许的
class A {
public:
void print() { cout << ++x; }
private:
int x = 10;
};
int main() {
A* ptr;
int* ptr2;
{
A a;
ptr = &a;
int b = 10;
ptr2 = &b;
}
ptr->print();
cout << ++*ptr2;
}
你为什么认为这是允许的?你说的“允许”是什么意思
所示程序的行为未定义
在这种情况下,为什么程序不抛出异常
因为当行为未定义时,程序不能保证抛出异常。程序的行为没有任何保证
当程序分配一些东西来代替被破坏的对象时,异常会出现吗
不,没有这样的保证,没有任何保证
可能导致在定义良好的程序中抛出对象的情况:
- 一个
抛出表达式
- 调用(可能隐式地)使用
throw
表达式的函数
动态广播
typeid
新建
表达式
欢迎来到这个程序中为什么程序不抛出异常的定义不明确的行为?——因为只有少数情况下C++程序被保证抛出异常,而且这些地方都在C++标准文档中提到(例如:代码> STD::vector::())/Cyp>将引发异常。。在代码中犯错误(例如您正在犯的错误)并不是引发异常的地方,而是未定义的行为。感谢您的回答,现在我明白了为什么在这里获取异常不是一件事。@JohnnyApp链接您在我的书签中提供了登录。为什么允许这样做?因为所有的测试都需要确保程序员没有做过愚蠢的事情会减慢所有没有做过愚蠢事情的程序员的程序。你会发现一些环境会在调试版本中插入对常见UB的检查以帮助你发现错误,但发布版本都是关于速度的。