C++ 在C++;自动为其成员分配内存。我错了吗?

C++ 在C++;自动为其成员分配内存。我错了吗?,c++,pointers,data-structures,C++,Pointers,Data Structures,我写了下面的代码,我相信如果我试图访问一个我甚至没有分配内存的结构的成员,它会崩溃。但我非常惊讶C++为这个结构自动分配内存。这是正常的行为吗?为了进行比较,如果您声明一个指向对象的指针,然后尝试访问任何成员,而没有使用运算符“new”实际创建对象,则程序将崩溃。我只是好奇为什么我认为它不应该起作用 这是我的节目: #include <stdio.h> struct Produto { int codigo; float preco; }; int main()

我写了下面的代码,我相信如果我试图访问一个我甚至没有分配内存的结构的成员,它会崩溃。但我非常惊讶C++为这个结构自动分配内存。这是正常的行为吗?为了进行比较,如果您声明一个指向对象的指针,然后尝试访问任何成员,而没有使用运算符“new”实际创建对象,则程序将崩溃。我只是好奇为什么我认为它不应该起作用

这是我的节目:

#include <stdio.h>

struct Produto
{
    int codigo;
    float preco;
};

int main()
{
    struct Produto* sabonete;
    sabonete->codigo = 654321;
    sabonete->preco = 0.85;

    printf( "Codigo = %i\n", sabonete->codigo );
    printf( "Preco = R$ %.2f\n", sabonete->preco );

    return 0;
}
#包括
结构产品
{
int codigo;
浮子预滤器;
};
int main()
{
结构Produto*sabonete;
Sabonet->codigo=654321;
sabonete->preco=0.85;
printf(“Codigo=%i\n”,sabonete->Codigo);
printf(“Preco=R$%.2f\n”,sabonet->Preco);
返回0;
}
操作系统:Windows 7

编译器:MinGW GCC 4.6.1

C++没有自动分配内存;指针持有一个任意值,该值恰好是程序内存空间中的一个有效地址,因此不会出现segfault。您的程序表现出未定义的行为,下次运行时可能无法运行

未定义的行为不能保证崩溃,这就是为什么它被称为未定义。

您遇到了未定义的行为 在第2行中,Sabonet指向的内容未定义。它可以指向在你改变它时不会破坏任何东西的内存,也可以指向在你改变它时启动核武器的内存


C++根本没有给你分配内存,你只是在踩内存,而恰好没有破坏任何东西。

不,恰恰相反。该指针未初始化,您正在通过取消引用来调用UB。如果你想要一个指针,你必须通过现有的指针或者调用“<代码>新< /Cord>”(或者,更好的是,这是C++,作为一个容器来处理分配/销毁,即RAII)。
根据定义,未定义的行为意味着任何事情都可能发生。当然,由于内存布局等原因,它有时可能会正常工作,但不能保证它总是正常工作,您永远不应该编写这样的代码。

由于g++编译器不会将未分配的指针初始化为NULL,它可能指向内存中的某个部分,其中包含乍看正确的数据


回答这个问题,是的,当你不愿意为你的对象分配内存时,它是正常的但未定义的行为:(

< p>)如果你对引擎盖下可能发生的事情感兴趣,请考虑你的平台上的<代码> SabOntEt/Cuff>是4字节宽(作为指针),因为你的主没有声明参数。(操作系统允许在任何情况下可用),可以占用相同的内存空间,这通常与参数顺序相反

如果是这样,它将覆盖指向指针数组(至少应包含16个指针数组)的字符**argv,该指针数组指向包含命令行部分的字符串

实际上,您是在分配值,并将其写入该数组中,因为它属于您的程序,所以操作系统不会抱怨。而且,由于您从不引用它的原始值,也没有其他人更改它们,所以一切看起来都正常工作


但这并不是因为它很好。这是因为你很幸运地在一个空间中安装了一个你不感兴趣的东西。在这种情况下,你错了。这似乎是可行的,这是未定义的行为。修复代码中的错误,神秘就会消失。坏代码会做奇怪的事情,这就是它的方式。关键问题是M和你所说的“C++自动分配了结构”,它没有。指针只是一个MEM地址,它不知道它在哪里。C++不自动分配内存。在堆检查器下运行它,你会得到无效内存引用的报告。C++(如C)出于性能原因,默认情况下不检查这些选项:这是高级语言中的裸机编程。但当printf执行时,它会打印我分配给结构成员的确切值,因此实际上它可以工作。@FernandoAiresCastello:不,事实上不可以。您正在调用未定义的行为。根据定义,任何东西都可以可能会发生。你的代码不正确。它会一直工作到……你把数据放进去,然后再做一些工作,然后它从你下面变出来。如果你写这样的程序,你会发现它们似乎有随机行为,也有安全漏洞。它的工作原理与以每小时80英里的速度在高速公路上疾驰,距离y有3英尺我们的前保险杠和下一辆车的“工作”。你也许可以侥幸逃脱,但很可能是最轻微的事情会出错,然后你就彻底崩溃了。FTR 80英里/小时大约是130公里/小时。让我印象深刻的是,如果指针持有任意内存地址,那么为什么每次我运行此代码时,这个任意内存地址都正好指向结构@FernandoAiresCastello:你似乎仍然感到困惑。当你调用未定义的行为时,没有押韵或理由。该行为是未定义的。任何事情都可能发生,不需要解释为什么会发生。在指针上方添加变量声明,你可能会看到崩溃。也许不会。同样,未定义的行为。好的,谢谢。我想好了实际上是有效的,因为这些值被正确地分配给了结构的成员。但我通常不会这样做,我总是初始化指针。我只是想看看会发生什么:)