c++ - 'registering' 对象放入同一个类中的静态数组时内存泄漏

标签 c++ memory-leaks static-methods

我想创建一个给定类的固定数量的实例,每次我创建一个我想将它添加到 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/

相关文章:

c++ - 数字的基本表示 - 输出顺序相反

tomcat - Vaadin 应用程序创建导致内存泄漏的线程

c# - Parallel.ForEach(...) 内的 System.Drawing 内存泄漏

c++ - int 类型的构造函数

C++为什么调用这个析构函数,它从哪里来

Java静态方法与主要静态方法

java - 属性文件不会在静态代码中加载,出现 NullPointerException

constructor - Dart 工厂(构造函数)与静态方法;例如,为什么 int.parse() 不是工厂构造函数?

c++ - 有没有更有效的方法来计算正模数?

jquery - Backbonejs 应用程序中的内存泄漏问题