我有一个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
是否可以通过这种方式将容器的每个元素强制转换为智能指针,还是需要显式删除原始指针?
而不是将每个指针都包装在unique_ptr
中,我会考虑使用Boost ptr_vector
。
假设已分配了数据,所以您实际上[[可以使用ptr_vector
删除它,代码看起来像这样:
delete
...并且size_t response_count = api.getResponseCount(); // Unfortunately, we have to define, then resize. It has a ctor that takes a size, // but it treats that as an amount to reserve rather than an actual size. boost::ptr_vector<Response> responses; responses.resize(response_count); api.getResponses(responses.c_array()); for(auto response : responses) { // Do some processing with response }
超出范围时,它将删除其包含的指针所指向的所有对象。如有必要,可以指定responses
类,该类定义如何分配和删除对象。参考
Allocator
https://www.boost.org/doc/libs/1_71_0/libs/ptr_container/doc/ptr_container.html
然后您可以在基于for的范围内使用辅助程序,如下所示:>
struct helper{ helper( response* p ) : p_{p} {} ~helper() { delete p_; } response* operator->(){ return p_;} private: response* p_; };
请参见工作版本for( helper resp : responses ){... }