我想创建一个给定类的固定数量的实例,每次我创建一个我想将它添加到 vector
这是一个 static 成员
同一个类(class)。我尝试了以下代码,但它似乎不起作用(在主函数中 Column::GetColumns()
调用返回一个空的 vector
)而且它泄漏了内存( Valgrind 提示 kUsername
没有被销毁)。
非常感谢任何建议!
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Column {
public:
static const Column kUsername;
static const Column kPassword;
static vector<Column*> GetColumns() {
return columns_;
}
string GetColumnName() const {
return column_name_;
}
private:
static vector<Column*> columns_;
explicit Column(const string& column_name) : column_name_(column_name) {
columns_.push_back(this);
}
Column(const Column& column) : column_name_(column.column_name_) {}
virtual ~Column() {}
string column_name_;
};
const Column Column::kUsername("Username");
const Column Column::kPassword("Password");
vector<Column*> Column::columns_;
int main(void) {
cout << Column::kUsername.GetColumnName() << endl;
cout << Column::kPassword.GetColumnName() << endl;
const vector<Column*>& columns = Column::GetColumns();
for (vector<Column*>::const_iterator it = columns.begin();
it != columns.end();
++it) {
cout << (*it)->GetColumnName() << endl;
}
return 0;
}
最佳答案
您依赖于静态对象的特定初始化顺序。在这两行上:
const Column Column::kUsername("Username");
const Column Column::kPassword("Password");
你正在调用这个构造函数:
explicit Column(const string& column_name) : column_name_(column_name) {
columns_.push_back(this);
}
这假设对象 columns_ 已经被初始化。显然,它没有。读这个:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14从 10.14 到 10.18
关于c++ - 'registering' 对象放入同一个类中的静态数组时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8782999/