两个几乎相同的C++程序,一个运行良好,但另一个出现运行时错误
Two almost identical C++ program, one runs well but the other get runtime error
比较以下两段代码:
1.
#include <iostream>
using namespace std;
class B{
public:
int val;
};
int main(){
B *b;
int t = 0;
b->val = 1;
cout << 123 << endl;
return 0;
}
2.
#include <iostream>
using namespace std;
class B{
public:
int val;
};
int main(){
B *b;
b->val = 1;
cout << 123 << endl;
return 0;
}
两个版本都编译。代码#1运行良好,但代码#2出现运行时错误。
我正在使用C++11进行编译,并运行一台windows机器。
这真的让我很困惑。有人能告诉我原因吗?
两者都是错误的。b
指针未初始化,因此您不应该通过它访问内存。
B *b;
b->val = 1;
所以当其中一个坠毁时你很幸运。
另一个你运气不好,它没有坠毁。
Fixes
您可以删除间接寻址。。。
B b;
b.val = 1;
或者你可以分配它…
std::unique_ptr<B> b(new B());
b->val = 1;
您在此处取消引用未初始化的指针
b->val = 1;
指针指向的位置尚未确定:它可以指向任何位置。
这个指针后面是未定义的行为(UB(,这意味着任何事情都可能发生,这就是您所看到的。
真正发生的事情是,你正在向一段内存写入一个不应该写入的值。没有办法知道那里有什么,C++标准也不能对可能的结果做出任何承诺。它只是称之为UB。避免这些情况由你决定。
问题是您使用的是一个未初始化的指针:B* b;
。在C和C++中,内置类型在创建时不会初始化:它们只是包含垃圾。
解决问题的方法很简单:不要使用指针。B b;
将创建一个类实例并调用其构造函数。
代码#1运行良好,但代码#2出现运行时错误。
用标准化的说法,这两个代码都表现出未定义的行为。这意味着几乎任何事情都可能发生,这包括似乎在工作(即,可能存在错误,但没有明显的症状(。
在使用任何指针之前,都需要初始化它。你看到的是所谓的未定义行为。
#include <iostream>
using namespace std;
class B{
public:
int val;
};
int main(){
B *b = new B();
int t = 0;
b->val = 1;
cout << 123 << endl;
delete b;
return 0;
}
应该和一样工作
#include <iostream>
using namespace std;
class B{
public:
int val;
};
int main(){
B b;
int t = 0;
b.val = 1;
cout << 123 << endl;
return 0;
}
b->val
指向一个无效的内存位置。在分配b->val
之前为b
分配内存
相关文章:
- 运行同一解决方案的另一个项目的项目
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行另一个并行线程
- 使用 (cin) 用户输入将其粘贴到 std::system 中,并在另一个终端中运行带有输入的命令
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 助推.如何在另一个测试单元中运行一个测试组件
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- C++ 减慢另一个正在运行的进程
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 字符* 复制到另一个字符* 运行时错误
- C++ 菜单代码 - 运行另一个类
- 我无法使用 c++(代码块)中的 fstream 将文件内容复制到另一个。如何运行该文件?
- 一个应用程序可以运行另一个应用软件的代码吗
- 可以从用户检索输入并运行另一个进程
- 从C++程序在Linux中运行另一个程序
- 我如何打开/等待一个程序在c++中完成,然后运行另一个
- 编写一个程序来运行另一个已编写的程序
- 如何从c++程序中运行另一个程序
- 在我的Qt应用中运行另一个可执行文件