我知道我们通常不会致电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); 这样的新运算符。我该怎么办?
答案 0 :(得分: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(首先应该检查过载)。