gpt4 book ai didi

c++ - 释放从 placement new 分配的内存

转载 作者:太空狗 更新时间:2023-10-29 23:26:42 26 4
gpt4 key购买 nike

考虑以下代码,

#include "iostream"
#include "conio.h"

using namespace std;

class sample
{
private:
int i;
public:
sample(int ii=0) : i(ii){
cout<<"Constructing Object"<<endl;
}

~sample() { cout<<"Destructing Object"<<endl; }

void* operator new(size_t nSize, void* loc){
cout <<"Inside new"<<endl;
cout <<loc<<endl;
return loc;
}

void operator delete(void* ptr){
cout <<"Inside delete"<<endl;
free(ptr);
}
};


int main()
{
int intArr[2];
sample* samplePtr = new(intArr) sample(5);
cout <<samplePtr<<endl;

delete samplePtr;
// samplePtr->sample::~sample();
getch();
}

输出:

Inside New
0x22ff38
Constructing Object
0x22ff38
Destructing Object
Inside Delete

在这里,我正在动态请求已在堆栈上分配的内存。我读到我需要在完成后显式调用析构函数。但是当我尝试为堆栈上分配的内存调用 delete 时,我收到了对析构函数的调用。这是否意味着调用析构函数后堆栈上的内存被释放?

如果我动态请求之前在堆上分配的内存,在这种情况下我需要调用 delete,但 delete 是否实际上释放了堆栈上的内存?

最佳答案

普通的 new 运算符做两件事:

  1. 调用动态内存管理器获取内存块
  2. 调用构造函数

普通的删除运算符做相反的事情

  1. 调用析构函数
  2. 调用动态内存管理器释放内存块

Placement new 只做一步:

  1. 调用构造函数

所以“placement delete”应该只做一步:

  1. 调用析构函数

你不应该像你所做的那样在放置新的之后调用正常的删除。 (原因是这样做会要求动态内存管理器删除它没有分配的 block ,从而导致未定义的行为)

这一行是错误的:

delete samplePtr;  // WRONG

你需要做“placement delete”,这只是对 descructor 的原始调用:

samplePtr->~sample(); // CORRECT

关于c++ - 释放从 placement new 分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com