Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个几乎相同的C++;程序,一个运行良好,但另一个运行时出错_C++_Class_Pointers_Runtime Error - Fatal编程技术网

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;
}