Ошибка выполнения C ++ при push_back для вектора пользовательских объектов - PullRequest
0 голосов
/ 05 мая 2011

В моем классе, когда я пытаюсь вставить любой объект в вектор 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 Ответ

5 голосов
/ 05 мая 2011

Предположительно есть рабочий конструктор копирования для 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;
};
...