将每个指针包装在向量中的foreach循环的unique_ptr中

问题描述 投票:0回答:4

我有一个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

是否可以通过这种方式将容器的每个元素强制转换为智能指针,还是需要显式删除原始指针?

c++ memory-management unique-ptr
4个回答
2
投票

而不是将每个指针都包装在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

0
投票
您可以为自己编写一个删除指针的助手类。

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 ){...
}


0
投票
您可以为here创建一个分发唯一指针的包装器

0
投票
尽管不是很好的实践,但是可以使用非显式构造函数从here派生。
© www.soinside.com 2019 - 2024. All rights reserved.