c++ - 这是使用 unique_ptr 避免泄漏的最佳方法吗?
问题描述
我是初学者,我正在努力了解内存泄漏。
下面的代码是否有任何泄漏?unique_ptr
使用vector
and有意义map
吗?
我的目的主要是为了提高代码的性能和最小的容忍度。如果此代码错误,请告诉我我在哪里出错。
typedef struct MyStruct
{
std::string name;
int age;
} tMyStruct;
typedef std::map<std::unique_ptr<MyStruct>, std::unique_ptr<MyStruct>> den_mp;
typedef std::vector< std::unique_ptr<MyStruct> > den_vec;
den_mp m_mp;
den_vec m_vec;
void doit(auto& mp)
{
for (auto it = mp.begin(); it != mp.end(); it++)
{
std::cout << it->first->name << std::endl;
}
}
void doit2(auto& mp)
{
for (auto it = mp.begin(); it != mp.end(); it++)
{
std::cout << it->get()->name << std::endl;
}
}
void addvec(std::string name, int age)
{
std::unique_ptr<MyStruct> strt(new MyStruct);
strt->age = age;
strt->name = name;
m_mp.emplace(std::move(strt), std::move(strt));
}
void addvec2(std::string name, int age)
{
std::unique_ptr<MyStruct> strt(new MyStruct);
strt->age = age;
strt->name = name;
m_vec.emplace_back(std::move(strt));
}
int main()
{
addvec("ads", 10);
addvec2("asdfg", 10);
doit(m_mp);
doit2(m_vec);
std::cin.get();
}
解决方案
代码有泄漏吗?
不,据我所知,所示程序没有内存泄漏。
但是,这被打破了:
m_mp.emplace(std::move(strt), std::move(strt));
如果您从某物移动两次,那么第二次移动将来自已经移动的对象。在这种情况下,唯一指针在被移动后将为空。
不能有多个指向同一个对象的唯一指针。这就是为什么它被称为“独特”。
使用 unique_ptr 矢量和地图有意义吗?
它可以。但这并不总是有意义的。当将对象本身存储为元素就足够时,它可能会不必要地低效。
推荐阅读
- cypress - cypress 代码覆盖率 out.json 始终为空
- python - 如何在 PySpark 中将多个参数传递给 Pandas UDF?
- html - How to align grid items vertically using display:grid and fill all vertical empty space?
- graphql - 我不能在 apollo-server 中创建一个 rest API 吗?
- python - 为什么在由 Apache 运行时,来自 Google Secret Manager API 的 gRPC 调用会挂起?
- dolphindb - 关于“流表不支持直接访问的错误。请使用sql查询检索数据”
- ios - 在终止状态下调试flutter ios应用程序的最佳方法
- ios - 防止在颤动中仅在单个屏幕上进行单屏录制或屏幕截图
- python-3.x - 你能帮我用 Python 做这个系列吗?
- python - 无法使用 XY 从 csvs 生成多边形