直接调用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); 这样的新运算符。我该怎么办?
你有两个问题:
- 你只分配了三个字节
- 你没有初始化你分配的内存。
这两者都会导致未定义的行为。
operator new
函数的参数是要分配的字节数,而不是初始化分配内存的内容到.
new
运算符和函数 operator new
是两个行为不同的不同事物。
有关详细信息,请参阅 this old question and answers。
我认为你的代码中的主要误解是你认为这里:
int* p=(int*)operator new (3);
您正在这样做:
int* p = new int(3);
它打印垃圾值,因为你的 int
到 p
点还没有被初始化。
你实际上做的是分配3个字节的内存用于存储和int
。所以 int 指针 p
现在将指向分配了 3 个字节的内存(在大多数平台上,您需要 4 个字节来存储 int
)。
有关详细信息,请参阅 new C++ reference(您应该检查第一个重载)。
我知道我们一般不会直接调用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); 这样的新运算符。我该怎么办?
你有两个问题:
- 你只分配了三个字节
- 你没有初始化你分配的内存。
这两者都会导致未定义的行为。
operator new
函数的参数是要分配的字节数,而不是初始化分配内存的内容到.
new
运算符和函数 operator new
是两个行为不同的不同事物。
有关详细信息,请参阅 this old question and answers。
我认为你的代码中的主要误解是你认为这里:
int* p=(int*)operator new (3);
您正在这样做:
int* p = new int(3);
它打印垃圾值,因为你的 int
到 p
点还没有被初始化。
你实际上做的是分配3个字节的内存用于存储和int
。所以 int 指针 p
现在将指向分配了 3 个字节的内存(在大多数平台上,您需要 4 个字节来存储 int
)。
有关详细信息,请参阅 new C++ reference(您应该检查第一个重载)。