这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C

Is this a system resource? (or how do I know if I need to delete a pointer) - working with C in C++

本文关键字:指针 删除 C++ 系统资源 或者 是否 我怎么知道      更新时间:2023-10-16

看看这个 cplusplus.com 时间的例子,让我更多地思考指针。代码没有delete(也没有new(。

警告:我通常尽量避免指针,所以我绝对不精通。

我从下面的示例中删除了很多代码,以便专注于我的问题:

/* time example */
#include <stdio.h>      /* printf */
#include <time.h>       /* time_t, struct tm, difftime, time, mktime */
int main ()
{
time_t timer;
time(&timer);  /* get current time; same as: timer = time(NULL)  */
return 0;
}

我应该在最后删除计时器,还是仅指向系统资源?我的理解是,每当我使用new时,我都应该使用delete。认为因为我不使用new,所以我不需要delete是否正确。

这个堆栈问题似乎是我正在寻找的,并解释说我不需要delete(与网站上的示例代码匹配(,因为我没有做new;但是,我不确定我正在使用的函数没有在某处调用new(因为我发现很难阅读源代码(。我怎么知道?我需要知道吗?

我真的很讨厌使用这个旧的时间代码,迫不及待地想迎接即将到来的 C++20chrono更新,但这对我的项目来说太遥远了。

简短回答:

不!


长答案:

代码中没有指向分配了new的内存的指针,因此无需delete任何操作。而且,你的推理是正确的,每当你在代码中分配一些东西时,你也有责任取消分配它。最好使用 RAII(资源获取即初始化(来管理需要取消分配的资源。

对于您关于 API 内部分配的问题,作为程序员,自己有责任浏览 API 的文档来解决这个问题。某些 API 要求您以特定方式取消分配分配的内存,这(理想情况下(有很好的文档记录,您应该遵循这一点。

在 C 语言中,使用malloc()分配的内存必须使用free()取消分配。

在C++中,分配了newnew[]的内存必须分别取消分配deletedelete[]

顺便说一句,您应该尽可能使用 C++11 的智能指针(分别为std::unique_ptrstd::shared_ptr以及std::make_uniquestd::make_shared(在代码中强制执行 RAII。

您可以deletetimer是否将其定义为带有new关键字的指针:

time_t *timer = new time_t(50);
// do something with *timer
delete timer;

在波纹管情况下:

{
time_t timer;
time(&timer);
}

您只需将带有&(参考符号(和time_t timer的地址传递timer并将其存储在堆栈中。在块结束时,它将自动删除。