这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
Is this a system resource? (or how do I know if I need to delete a pointer) - working with C in C++
看看这个 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++中,分配了new
或new[]
的内存必须分别取消分配delete
或delete[]
。
顺便说一句,您应该尽可能使用 C++11 的智能指针(分别为std::unique_ptr
和std::shared_ptr
以及std::make_unique
和std::make_shared
(在代码中强制执行 RAII。
您可以delete
timer
是否将其定义为带有new
关键字的指针:
time_t *timer = new time_t(50);
// do something with *timer
delete timer;
在波纹管情况下:
{
time_t timer;
time(&timer);
}
您只需将带有&
(参考符号(和time_t timer
的地址传递timer
并将其存储在堆栈中。在块结束时,它将自动删除。
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存