【发布时间】:2019-11-20 23:12:58
【问题描述】:
我有一个 api 调用,它填充了一个原始指针数组,供调用者使用。这个函数堆分配每个原始指针但不分配数组。
无论它有多糟糕,我都无法更改此 API 函数。
调用api函数代码如下:
size_t response_count = api.getResponseCount();
std::vector<Response*> responses(response_count);
api.getResponses(responses.data());
for(auto response : responses) {
// Do some processing with response
delete response;
}
我想将每个响应包装在一个 unique_ptr 中,以便在循环迭代结束时仍将其清理干净,而无需显式调用 delete。理想情况下,这看起来像:
for(std::unique_ptr<Response> response : responses) {
// Do some processing with response
// No need to delete response, it will be cleaned up as it goes out of scope
}
这不会编译,因为编译器无法将指针转换为 unique_ptr:
error: conversion from ‘Response*’ to non-scalar type ‘std::unique_ptr<Response>’ requested
有没有办法以这种方式将容器的每个元素转换为智能指针,还是我需要显式删除原始指针?
【问题讨论】:
-
没问题。感谢您查看问题:)
-
为什么
api.getResponses不接std::vector<std::unique_ptr<Reponse>>? -
如果它是一个 C 函数,这无论如何都是一个糟糕的主意。 C 不
new和因此delete任何东西。那么,再一次,是什么分配了在那个指针序列中返回的东西?例如。responses序列中的每个指针指向什么,究竟是谁分配了它,以及它是通过什么方式分配的?仅仅因为您使用 C++ 并不意味着某些任意动态指针一定来自new,因此对于delete来说已经成熟。 -
那么
delete response是无效的,对吧?应该是free(response)。 -
不是向量的自定义删除器,而是循环中的 unique_ptr。自定义删除器看起来不那么干净,因此循环中的显式删除(可能带有注释?)可能是最干净的
标签: c++ memory-management unique-ptr