【发布时间】:2014-07-04 08:24:49
【问题描述】:
我使用 std::shared_ptr 编写了一个非常简单的 C++ 程序。
代码如下:
/*
** Resource class definition
*/
class Resource
{
public:
std::string m_Name;
Resource(void){}
Resource(std::string name)
: m_Name(name)
{
}
std::string const &GetName(void) const
{
return (this->m_Name);
}
};
namespace Predicate
{
/*
** Predicate - Delete a specific node according to its name
*/
template <typename T>
struct DeleteByName
{
DeleteByName(std::string const &name);
bool operator()(T &pData);
std::string m_Name;
};
//Initialization
template <typename T>
DeleteByName<T>::DeleteByName(std::string const &name)
: m_Name(name)
{
}
//Surcharges
template <typename T>
bool DeleteByName<T>::operator()(T &pData)
{
if (pData->GetName() == this->m_Name)
{
pData.reset();
return (true);
}
return (false);
}
}
/*
** Remove a specific node according to its name - WORKS
*/
static void RemoveByName__CLASSIC__OK(std::string const &name, std::vector<std::shared_ptr<Resource>> &resourceList)
{
std::vector<std::shared_ptr<Resource>>::iterator It = resourceList.begin();
std::vector<std::shared_ptr<Resource>>::iterator It_dest;
for (; It != resourceList.end(); ++It) {
if (!(*It)->GetName().compare(name))
{
It_dest = It;
}
}
It_dest->reset();
resourceList.erase(It_dest);
}
/*
** Remove a specific node according to its name - NOT WORK
*/
static void RemoveByName__CLASSIC__NOT_OK(std::string const &name, std::vector<std::shared_ptr<Resource>> &resourceList)
{
std::vector<std::shared_ptr<Resource>>::iterator It = resourceList.begin();
for (; It != resourceList.end(); ++It) {
if (!(*It)->GetName().compare(name))
{
It->reset();
resourceList.erase(It);
}
}
}
static std::vector<std::shared_ptr<Resource>>::const_iterator FindByName__PREDICATE__OK(
std::string const &name, std::vector<std::shared_ptr<Resource>> &resourceList)
{
return (std::find_if(resourceList.begin(),
resourceList.end(), Predicate::FindByName<std::shared_ptr<Resource>>(name)));
}
/*
** Remove a specific node according to its name using std::remove_if algorithm with the predicate 'DeleteByName' - WORKS
*/
static void RemoveByName__PREDICATE__OK(std::string const &name, std::vector<std::shared_ptr<Resource>> &resourceList)
{
if (FindByName__PREDICATE__OK(name, resourceList) != resourceList.end())
resourceList.erase(std::remove_if(
resourceList.begin(), resourceList.end(), Predicate::DeleteByName<std::shared_ptr<Resource>>(name)));
}
/*
** Entry point
*/
int main(void)
{
std::vector<std::shared_ptr<Resource>> resourceList;
std::shared_ptr<Resource> rsc_A(new Resource("resource_a"));
std::shared_ptr<Resource> rsc_B(new Resource("resource_b"));
std::shared_ptr<Resource> rsc_C(new Resource("resource_c"));
resourceList.push_back(rsc_A);
resourceList.push_back(rsc_B);
resourceList.push_back(rsc_C);
PrintResourceList(resourceList);
RemoveByName__PREDICATE__OK("resource_as", resourceList);
PrintResourceList(resourceList);
getchar();
return (0);
}
我只想知道我是否从包含共享指针的 std::vector 中删除了一个节点,是否必须在调用“erase”方法之前调用“reset”方法来销毁共享指针。我认为,如果我只是销毁节点而不调用函数“重置”,则共享指针仍应被销毁。对吗?
另外,我不明白为什么函数“RemoveByName__CLASSIC__NOT_OK”会失败。我不明白为什么我必须在循环期间声明一个“It_dest”来存储迭代器(参见方法“RemoveByName__CLASSIC__OK”),最后在函数结束时擦除节点。这个问题只是使用共享指针发生的。有人有想法吗?
【问题讨论】:
标签: c++ shared-ptr smart-pointers