关于直接调用operator new函数的困惑

时间:2015-09-19 16:41:57

标签: c++ new-operator

我知道我们通常不会致电operator new& operator delete直接发挥作用。因为如果我这样做的构造函数&析构函数不会被称为&它可能最终导致内存泄漏。但对于原始类型,这似乎没有问题。纠正我如果我错了。

考虑以下计划:

#include <iostream>
int main()
{
    int* p=(int*)operator new (3);
    std::cout<<*p;
    operator delete(p);
}

为什么打印垃圾值作为输出?我在这做错了什么?我很想知道如何通过直接调用operator new函数来正确赋值。我希望程序3的输出作为输出,但不使用像 int * p = new int(3); 这样的新运算符。我该怎么办?

2 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. 您只需分配三个字节
  2. 您没有初始化您分配的内存。
  3. 这两种情况都会导致未定义的行为

    operator new 函数 的参数是要分配的字节数,而不是将分配的内存初始化为的内容。

    new运算符和函数operator new是两种行为不同的东西。

    有关详细信息,请参阅this old question and answers

答案 1 :(得分:1)

我认为您的代码中的主要误解是您认为:

int* p=(int*)operator new (3);

你这样做:

int* p = new int(3);

它会打印垃圾值,因为int点尚未初始化p

你实际做的是分配3个字节的内存用于存储和int。所以int指针p现在指向内存,分配3个字节(在大多数平台上,你需要4个字节来存储int)。

有关详细信息,请参阅new C++ reference(首先应该检查过载)。