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