代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

C++中使用MALOC后的行为

  •  0
  • Prasoon Saurav  · 技术社区  · 14 年前

    下面的代码是否调用未定义的行为?据我所知,我们应该总是使用new来动态创建用户定义的对象,因为new除了malloc之外还调用构造函数。

    #include <cstdio>
    #include <cstdlib>
    
    struct om
    {
        int a;
        void fun()
        {
            a=10;b=10;
        }
        private : int b;
    
    } s1; // structure(om) variable... 
    
    
    typedef struct om node;
    
    int main()
    {
    node *s2=(node *)malloc(sizeof(node));
    s1.fun();
    printf("%d",s2->a);
    return 0;
    }
    

    上面的代码打印0。这意味着 s2->a 自动初始化为 0 所以我想知道程序实现的行为是定义的、未定义的还是定义良好的?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Will A    14 年前

    malloc 不能保证初始化它分配的内存-如果您想用0填充内存,请使用 calloc

        2
  •  3
  •   TheUndeadFish    14 年前

    上面的代码打印0。这意味着s2->a自动初始化为0?

    不。 malloc 没有这样的保证。在您的简单示例中,最有可能发生的情况是malloc碰巧使用了一个新的内存区域,而该区域当时恰好只有零。因为程序非常简单,所以每次都可能重复此行为。但是在一个更复杂的程序中,内存被重用,你不会总是看到零。

    据我所知,我们应该总是使用new来动态创建用户定义的对象,因为new除了malloc之外还调用构造函数。

    马洛克 不调用构造函数。 new 做。在C++编写代码时,始终建议使用代码是非常可取的。 新的 (甚至对于基本类型,而不仅仅是用户定义的类型)。

    下面的代码是否调用未定义的行为?

    我不是语言律师,但我会试试。。。

    我相信这可以说是一个定义良好的行为,这种未初始化的变量有未定义的值。所以不管什么价值 s2->a 最终有,它是遵循C++标准的。

        3
  •  2
  •   sbi    14 年前

    你在解释一段原始记忆(这是什么 std::malloc() (node*)malloc(...) )然后访问其中的成员( s2->a ). 在实践中,只要类型只包含内置类型的成员而不包含指针,就可以避免这种情况,但从技术上讲,这是在调用未定义的行为。
    调用未定义的行为是不好的,因为它允许您的程序执行任何操作。它可能会使你的程序崩溃,默默地产生错误的结果,格式化你的硬盘,烧掉你的CPU,使你怀孕,或者它可能会按你预期的方式工作。它现在的表现可能是一种方式,但对于新的编译器版本、操作系统升级、在另一个平台上、在客户的网站上、当你的老板观看时、星期天或根据月相的不同而有所不同。

    构造函数是将原始内存转换为有效对象的工具。在堆栈上创建对象、全局对象或使用 new 新位置 标准::malloc()

    为什么你的问题被标记了 C++

        4
  •  1
  •   kizzx2    14 年前

    行为没有定义。malloc不会调用构造函数来初始化内存。这就是为什么它是最快的方法来分配内存在C++中

        5
  •  0
  •   SPIRiT_1984    14 年前

    在您的简单示例中,最有可能发生的情况是malloc碰巧使用了一个新的内存区域,而该区域当时恰好只有零。

    实际上不,这是编译器的细节。另外,请考虑以下程序代码:

    #include <stdio.h>
    
    int i;
    
    int main() {
      while (i<10) {
        printf("Hello\n");
        i++;
      }
      return 0;
    }
    

    你的代码也是如此。使用malloc可以为变量获得内存片段,但是没有 初始化

    也要看这个 reference . 很明显,malloc不初始化任何东西。而且,你应该 总是 调用malloc后显式释放内存,否则会导致内存泄漏。