从vector2传递指针到vector1,并安全清除vector1
Passing pointers to vector1 from vector2 and clearing vector1 safe?
我对c++还是有点陌生,这可能是一个简单的答案,但我有一种情况,我有一个向量,里面有一些指向对象的指针,我把这些指针给了另一个向量。清除第二个向量会导致孤儿或内存泄漏之类的问题吗?
编辑:我想我没有说清楚,这里有一个例子
#include <vector>
std::vector<SomeObject*> objects1; # Assume this is filled with objects
std::vector<SomeObject*> objects2; # Empty
for (unsigned int i = 0; i < objects1.size(); i++)
{
objects2.push_back(objects1[i]);
}
# There's some code in between, the objects themselves aren't modified
# it's just organization
objects2.clear(); # The question is about this line here
如果你谈论的指针是原始指针,那么没有。销毁原始指针不会对所指向的对象做任何操作。
(除非它是指向动态分配的内存块的最后一个指针,在这种情况下,您会泄漏内存。)
首先你有一组指针指向某物,然后你有另一组指针指向同一物(即指针是相同的)。然后去掉第二组指针。
可以更容易地写成:
objects2 = objects1;
,这与你的逐个成员复制完全相同。
如果这些指针具有std::unique_ptr
的语义,那么,你不能将它们复制到另一个向量上。如果你说的"给予"是指"移动",那么清除第二个向量就是释放这些指针所指向的内存。
如果这些指针具有std::shared_ptr
的语义,那么通过将它们赋给另一个向量,您只是增加了引用计数,并且提供第一个向量中的原始指针没有移动,清除第二个向量只会将引用计数减少到之前的值。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 从vector2传递指针到vector1,并安全清除vector1