push_back上的C ++运行时错误,用于自定义对象的向量

时间:2011-05-04 21:11:14

标签: c++ stdvector

在我的课堂上,当我尝试将任何对象推送到矢量myCache时,我收到运行时错误。我知道我正在正确地初始化矢量,并且很难理解为什么会发生这种情况。

#ifndef CACHE_H
#define CACHE_H

#include <iostream>
#include "cacheblock.h"
using namespace std;

class Cache
{
  public:
   Cache(int rows, int numWords);
   ~Cache();
   CacheBlock getBlock(int index);

  private:
   vector<CacheBlock> *myCache;
};

#endif

Cache::Cache(int rows, int numWords)
{
   myCache = new vector<CacheBlock>;
   CacheBlock test(rows, 0, 0);
   myCache->push_back(test);

/*
   for (int i = 1; i < rows; i++)
   {
      myCache->push_back(test);
      cout << "inside loop\n\n";
   }
*/
}

CacheBlock.h:

class CacheBlock
{
  public:
   CacheBlock(int numWords, int newIndex, int tagNum);
   CacheBlock(const CacheBlock &newCacheBlock);
   ~CacheBlock();
   void setData(int numWords, int newIndex, int tagNum);

  private:
   bool valid;
   int index;
   int tag;
   vector<int> *dataWords;
};

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

据推测,CacheBlock有一个正常的复制构造函数?

编辑:感谢您发布其他代码。

如果CacheBlock的析构函数通过删除清除已分配的vector<int> *dataWords,则复制构造函数将需要“深度复制”dataWords的向量。如果没有此深层副本,则在复制CacheBlock时,将会有两个CacheBlock实例与vector<int>具有相同的指针。当清理第一个实例时,第二个实例将以一个指向现在删除的副本的迷路指针结束。

值得一提的是,正如评论所暗示的那样,为什么vectors<>正在从堆中分配,如果它们没有从堆中分配,但仅仅是成员变量,这些问题都不会已经发生了。

即便:

#ifndef CACHE_H
#define CACHE_H

#include <iostream>
#include "cacheblock.h"
using namespace std;

class Cache
{
  public:
   Cache(int rows, int numWords);
   // no longer need a destructor, as the auto-generated one by the compiler suffices
   // ~Cache();
   // potential optimization to return by const reference, rather than by copy
   const CacheBlock& getBlock(int index) const;

  private:
   vector<CacheBlock> myCache;
};

#endif

Cache::Cache(int rows, int numWords)
{
   // no longer need to construct the vector
   // myCache = new vector<CacheBlock>;
   CacheBlock test(rows, 0, 0);
   myCache->push_back(test);
}

CacheBlock.h:

class CacheBlock
{
  public:
   CacheBlock(int numWords, int newIndex, int tagNum);
   // no longer need a copy constructor
   // CacheBlock(const CacheBlock &newCacheBlock);
   // no longer need a destructor, as the compiler-generated one will suffice
   // ~CacheBlock();
   void setData(int numWords, int newIndex, int tagNum);

  private:
   bool valid;
   int index;
   int tag;
   vector<int> dataWords;
};