直接调用operator new函数的困惑

Confusion about calling operator new function directly

我知道我们一般不会直接调用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); 这样的新运算符。我该怎么办?

你有两个问题:

  1. 你只分配了三个字节
  2. 你没有初始化你分配的内存。

这两者都会导致未定义的行为

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

new 运算符和函数 operator new 是两个行为不同的不同事物。

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

我认为你的代码中的主要误解是你认为这里:

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

您正在这样做:

int* p = new int(3);

它打印垃圾值,因为你的 intp 点还没有被初始化。

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

有关详细信息,请参阅 new C++ reference(您应该检查第一个重载)。