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

Dav*_*vid 0 c++ time pointers delete-operator

看看这个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;
}
Run Code Online (Sandbox Code Playgroud)

我应该在此结束时删除计时器,还是只是指向系统资源?我的理解是每当我使用时new,我都应该使用delete.认为我没有使用是不对的new,我不需要delete.

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

我真的很讨厌使用这个旧的时间代码,不能等待即将到来的C++ 20 chrono更新,但这对我的项目来说太遥远了.

Aze*_*eem 5

简短回答:

没有!


答案很长:

您的代码中没有指向分配的内存的指针new,因此您不需要delete任何操作.并且,您的推理是正确的,无论何时在代码中分配某些内容,您都有责任对其进行解除分配.最好使用RAII(资源获取初始化)来管理需要解除分配的资源.

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

在C中,malloc()必须取消分配的内存free().

在C++中,分配有newnew[]必须分别用delete或分配的内存delete[].

顺便说一句,你应该使用C++ 11的智能指针(以及分别std::unique_ptr和它们std::shared_ptr一起)尽可能在你的代码中强制执行RAII.std::make_uniquestd::make_shared