C++ 两个几乎相同的C++;程序,一个运行良好,但另一个运行时出错
比较以下两段代码: 一,C++ 两个几乎相同的C++;程序,一个运行良好,但另一个运行时出错,c++,class,pointers,runtime-error,C++,Class,Pointers,Runtime Error,比较以下两段代码: 一, #包括 使用名称空间std; B类{ 公众: int-val; }; int main(){ B*B; int t=0; b->val=1; cout两者都是错误的。b指针未初始化,因此您不应该通过它访问内存 B *b; b->val = 1; 所以当其中一个坠机时你很幸运 另一个你运气不好,它没有坠毁 修复 您可以删除间接寻址 B b; b.val = 1; 或者你可以分配它 std::unique_ptr<B> b(new B()); b-&g
#包括
使用名称空间std;
B类{
公众:
int-val;
};
int main(){
B*B;
int t=0;
b->val=1;
cout两者都是错误的。b
指针未初始化,因此您不应该通过它访问内存
B *b;
b->val = 1;
所以当其中一个坠机时你很幸运
另一个你运气不好,它没有坠毁
修复
您可以删除间接寻址
B b;
b.val = 1;
或者你可以分配它
std::unique_ptr<B> b(new B());
b->val = 1;
std::unique_ptr b(新b());
b->val=1;
您正在此处取消引用未初始化的指针
b->val = 1;
指针指向的位置尚未确定:它可能指向任何地方
在这个指针后面是未定义的行为(UB),这意味着任何事情都可能发生,这就是您所看到的
真正发生的是,你正在为一段你不应该写的东西写一个值。没有办法知道那里有什么,C++标准不能对可能的结果作出承诺。它只是调用这个UB。你可以避免这些情况。
< P> <强>在使用I之前,需要初始化任何指针。t、
你看到的就是所谓的未定义行为
#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;
}
#包括
使用名称空间std;
B类{
公众:
int-val;
};
int main(){
B*B=新的B();
int t=0;
b->val=1;
CUT< P> <代码> B> > Val</代码>指向内存无效位置。分配代码为<代码> B/<代码>分配<代码> B-> Val< /Calp> > P>问题是,您使用的是未初始化的指针:<代码> B*B;< /C++ >。在C和C++中,内置类型在创建时未初始化:它们只是保存垃圾。
问题的解决方法很简单:不要使用指针。
bb;
将创建一个类实例并调用其构造函数
代码#1运行良好,但代码#2出现运行时错误
用标准的说法,这两个代码都表现出未定义的行为。这意味着几乎任何事情都可能发生,并且似乎都在工作(即,可能有错误,但没有明显的症状).您正在访问未初始化的指针-这两种情况下的行为都是undefined@MaciekB:这应该是一个答案,而不是注释。在第一个示例中,您正在泄漏内存。建议初学者时要小心,因为他们(不一定)会泄漏内存有知识来纠正这些小缺陷,并可以在面值上采纳你的建议。感谢提示。写的答案有点太怪异……第二个提示:在C++中,明智的做法是使用智能指针而不是手动删除,例如:代码> STD::UnQuyjpPTB(new B.);
+1表示幸运/不幸!+1表示使用智能指针。:)学到了很多。谢谢!我想说这两种情况都是不幸的。当未定义的行为似乎起作用时,你现在依赖它是不幸的。@dreamlax:两种选择不可能都是不幸的,这是一个逻辑矛盾。但请再读一读我写的:我称之为工作UB unlucky,不走运。我说你在UB坠毁的时候很走运,从那时起你就知道出了什么问题。
b->val = 1;
#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;
}