QCache and QSharedPointer
QCache and QSharedPointer
问题是,我有一个QSharedPointer
的QVector
,我想把它们的一部分到我的QCache
。我如何插入一个共享指针到QCache
?如果我将指针设置为我的缓存,但销毁QVector
和其中的共享指针,会发生什么?内存会被释放,我的缓存不会指向任何地方吗?
如果你把一个指针指向你的项目QChache
,同时这样的指针是由QSharedPointer
管理的,这是一个bug。item对象可以被QSharedPointer
析构函数销毁,因此QChache
将具有无效指针。这是一个通用的问题,你不能有不同的所有者的指针,彼此不知道。如果你通过QSharedPointer<Item>
管理指针,那么QChache
不应该直接与Item
一起工作,它应该只与QSharedPointer<Item>
一起工作,例如:
// wrong
QCache<int, Item> cache;
QVector<QSharedPointer<Item> > vec;
Item *item = new Item;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, item);
// or
cache.insert(1, vec.at(0).data());
// also wrong
QCache<int, <QSharedPointer<Item> > cache;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, new QSharedPointer<Item>(item));
// here two different instances of QSharedPointer are initialized
// by the same pointer 'item'
// correct
QCache<int, <QSharedPointer<Item> > cache;
cache.insert(1, new QSharedPointer<Item>(vec.at(0)));
因此,QCache
应该有自己的动态分配的QSharedPointer
对象的副本,并且QSharedPointer
对象应该由已经拥有Item
实例所有权的其他QSharedPointer
正确初始化。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- 删除 QSharedPointer 指向的 QObject
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- QCache and QSharedPointer