【发布时间】:2015-08-23 03:10:23
【问题描述】:
这是我的代码。
std::shared_ptr<WSUStudent> WSUStudent::registerStudent(
std::string lastName,
std::string firstName
)
{
auto result = std::shared_ptr<WSUStudent>(new WSUStudent(lastName, firstName));
s_allStudents.insert(&result);
return result;
}
我已经成功地改变了函数,使它返回一个 shared_ptr 而不是一个普通的指针。根据分配(我认为),我已经成功地用共享指针封装了“new”语句,但是“auto”下面的代码行在没有 & 的情况下不起作用,并且在 & 的情况下也不起作用。我收到一条错误消息,指出没有匹配的函数调用,无论是否带有 &。那行代码试图将新学生(或指向新学生的指针?)插入到所有学生的列表中。然而,“插入”方法并没有在本地被覆盖,所以我不太确定在这里做什么。下面打印错误。
/mnt/hgfs/Data Structures and Algorithms/HW04/WSUStudent.cpp:146:32: error: no matching function for call to ‘std::set<WSUStudent*>::insert(std::shared_ptr<WSUStudent>*)’
s_allStudents.insert(&result);
这个赋值的重点是通过将普通指针转换为弱指针和共享指针来修复内存泄漏(不会被指针删除的“新”语句)。原代码如下。
WSUStudent *WSUStudent::registerStudent(
std::string lastName,
std::string firstName
)
{
auto result = new WSUStudent(lastName, firstName);
s_allStudents.insert(result);
return result;
}
我做错了吗?我无法运行 s_allStudents 行。
【问题讨论】:
-
s_allStudents是什么类型? -
s_allStudents 的声明是 static std::set
s_allStudents;我将尝试在等待时将括号中的 WSUStudent * 更改为 shared_ptr。 -
s_allStudents.insert(&result);不好。您正在存储指向堆栈上对象的指针。 -
您可以使用 result.get() 来获取 shared_ptr 对象中的指针。
-
更改声明以使用共享指针解决了问题,但创建了一个新问题。当我修复新错误时,我会更新并回答我自己的问题。它看起来很简单。
标签: c++ pointers c++11 netbeans shared-ptr