qt中的动态成员分配
Dynamic members allocation in qt
如果方法GetCurrentStream()应该更改值*流,我不知道在构造函数(如下所示)或方法本身中动态分配(QFile*和QTextStream*)的位置。
头文件
class QLogger {
public:
explicit QLogger();
~QLogger();
QTextStream& GetCurrenStream();
private:
QFile *file;
QTextStream *stream;
};
以及在相关.cpp 中
QLogger::QLogger() {
file = new QFile;
stream = new QTextStream;
}
~QLogger() {
delete file;
delete stream;
}
QTextStream& GetCurrenStream() {
...
return *stream;
}
在哪里释放析构函数中的存储?
如果您能够在构建对象时为其提供所有必要的数据,那么您应该将所有初始化都放在构造函数中,因为它会创建实际的对象。通过这种方式,您可以确保您的对象在使用时准备就绪。
如果您没有使用任何特殊的模式,那么getter不应该创建它们返回的对象,而应该创建一个引用,就像您在GetCurrentStream()
中所做的那样。
其次,对于析构函数,这是从分配的对象中释放内存的实际位置。如果您有可能很危险的释放进程,则应该为此提供一个额外的方法,因为如果析构函数中出现故障,您将经历内存泄漏。此外,永远不要在析构函数中抛出异常!
如果您需要更改指向对象的指针(就像在GetCurrentStream()
中一样,您应该提供一种不同的方法来更改流,并在该方法中处理必要的释放)
还记得返回对类似的指针的引用
return *stream; //return reference to actual object, not the pointer!
总的来说,你在那里做的一切看起来都很好。
您所做的似乎是正确的。在构造函数中分配对象,然后在析构函数中删除它们。
但是,它不应该按原样构建,因为GetCurrentStream()
应该返回对流对象的引用,而您当前正在返回一个指针。
下面的代码示例可能就是缺失的部分。
QTextStream& GetCurrenStream() {
...
return *stream;
}
考虑使用智能指针来管理动态分配的对象。
在Qt中,您可以使用QScopedPointer
(在C++11中也有std::unique_ptr
)。
(正如上面评论中提到的:Q*名称基本上由Qt东西保留。)
class Logger {
public:
Logger();
QTextStream& getCurrenStream();
private:
QScopedPointer<QFile> file;
QScopedPointer<QTextStream> stream;
};
Logger::Logger()
: file(new QFile)
, stream(new QTextStream)
{
}
QTextStream& getCurrenStream() {
// ...
return stream.data(); // stream.get() with std::unique_ptr
}
智能指针会自动释放内存(对于QSharedPointer
和std::shared_ptr
,还有额外的引用计数,因此在存在共享指针副本时不会释放内存)。
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 是否可以基于私有/受保护成员分配类枚举?
- 将const char * const参数成员分配给新值
- C 构造函数成员分配优化
- SystemC犯错:键入不匹配成员分配
- 为仅读取成员分配值-C
- 将受保护的结构成员分配给朋友
- C :为指针成员分配值
- 派生类的实例化是否为基类的私有成员分配内存
- 静态对象的非静态成员分配在哪里
- 在静态成员分配之前调用函数
- 对象成员分配
- 通过 C++ 中的公共函数为私有成员分配值
- 将静态 constexpr 类成员分配给运行时变量
- qt中的动态成员分配
- 在C++中声明指向结构的指针会自动为其成员分配内存.我错了吗
- 为数据成员分配一个新的随机方向,该方向不同于 c++ 中的当前方向
- 如何在成员初始化列表中为const char*类成员分配内存
- 为结构成员分配的内存是连续的吗?如果struct成员是数组呢?
- c++类成员分配