我需要在重新分配指针之前调用 delete 吗?

3
以下哪种方式是避免内存泄漏的正确方法?
//Option A
char* data = new char[4];
data = new char[5];
delete[] data;

//Option B
char* data = new char[4];
delete[] data;
data = new char[5];
delete[] data;

2
B. 你应该手动删除所有你使用 new 创建的东西。 - songyuanyao
选项A是一个内存泄漏;由于在指向第二次分配的指针被覆盖后,你不知道原始分配的内存在哪里,所以它从未被销毁。如代码所示,选项A中的delete语句删除了第二次分配的内存。建议使用unique_ptrshared_ptr来避免这个问题。 - mkal
1
回答部分在下面,伙计们。 - Benjamin Lindley
以下链接可能对你有所帮助:链接 - Dipak Prajapati
你不一定需要执行delete操作。这种需要是源于内存泄漏的影响。如果程序的生命周期很短,且不分配大量内存,并且操作系统可靠地清理内存,那么不必担心释放内存是可以接受的,事实上这样做还减少了因不适当释放而引入错误的风险。 - Kaz
1个回答

5
选项A中存在明显的内存泄漏问题。假设您在某个内存位置0x7256AC7Dnew char[4];分配了内存,并且data指向该位置。然后,您又在另一个内存位置为new char[5];分配了内存,并且data指向这个新位置。现在,您没有指向旧位置0x7256AC7D的指针,也无法delete它。因此,您正在泄漏该内存。
另外,为了避免此类内存泄漏问题,最好或更容易使用C++11中的std::shared_ptrstd::unique_ptr

1
@Assimilater:关于那个评论的重要点在于std::vector,而不是它在C++98中是否可用。 - Benjamin Lindley
1
@taskinoorпјҡи§ЈйҮҠдёҖдёӢгҖӮдҪҝз”ЁжҷәиғҪжҢҮй’ҲжҜ”дҪҝз”Ёstd::vectorжӣҙе®№жҳ“з”ҹжҲҗеҶ…еӯҳжі„жјҸгҖӮжҷәиғҪжҢҮй’Ҳе…·жңүйҮҠж”ҫеҮҪж•°пјҢиҖҢstd::vectorжІЎжңүгҖӮ - Benjamin Lindley
1
@taskinoor:如果你使用new来创建一个智能指针,你会遇到同样的问题。但是为什么你要做这些事情呢? - Benjamin Lindley
1
@taskinoor,你在进行不恰当的比较。你提到的 std::vector 的建议类似于执行 std::shared_ptr<thing> *a = new std::shared_ptr<thing>(new thing())。Benjamin 谈论的是 std::vector<char> data(5);,没有使用 new 关键字。 - Assimilater
1
@taskinoor:不,这不是常见做法。但这也不是:std::vector<char>* a = new std::vector<char>; -- 我并没有建议这样做。 - Benjamin Lindley
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接