2010-11-02 18 views
0

Je rencontre un problème étrange dans la désallocation de la mémoire.Segfault pendant la désallocation du tableau C++

J'ai le code suivant pour MemoryPartition de classe:

#include <cstring> 
#include <iostream> 
#include "memorypartition.h" 

MemoryPartition::MemoryPartition(int maxSize) { 
    this->partitionArray = new char[maxSize]; 

    memset(this->partitionArray, ((int) '$'), maxSize); 

    this->maxSize = maxSize; 
    this->isFree = true; 
} 

MemoryPartition::~MemoryPartition() { 
    delete[] this->partitionArray; 
    this->partitionArray = NULL; 
    maxSize = 0; 
} 

void MemoryPartition::setFree(bool isFree) { 
    this->isFree = isFree; 
} 

bool MemoryPartition::getFree() { 
    return this->isFree; 
} 

int MemoryPartition::getMaxSize() { 
    return this->maxSize; 
} 

void MemoryPartition::getPartitionArray() { 
    for(int i = 0;i < maxSize;i++) { 
     std::cout << partitionArray[i] << ' '; 
    } 

    std::cout << std::endl; 
} 

et le code suivant pour memoryManager-:

#include "memorymanager.h" 
#include <iostream> 
#include <cstdlib> 

MemoryManager::MemoryManager() { 
} 

MemoryManager::~MemoryManager() { 
    memory.clear(); 
} 

void MemoryManager::defmem(int bytes) { 
    MemoryPartition *memPartition; 
    int maxMemorySize = bytes; 

    while(maxMemorySize != 0) { 
     int partitionSize = this->randomPartitionSize(maxMemorySize); 

     memPartition = new MemoryPartition(partitionSize); 
     this->memory.push_back(*memPartition); 

     std::cout << memPartition->getMaxSize() << std::endl; 
     memPartition->getPartitionArray(); 

     maxMemorySize -= partitionSize; 
     delete memPartition; 
     memPartition = NULL; 
    } 
} 

int MemoryManager::randomPartitionSize(int maxSize) { 
    int value; 

    srand(time(NULL)); 
    value = (rand() % maxSize) + 1; 

    return value; 
} 

et je suis obtenir un bizarre à supprimer [] dans MemoryPartition destructor. Valgrind me dit qu'il y a 13 libres et 10 allocs, mais je ne vois pas pourquoi cette delete [] s'appellerait 3x.

Quelqu'un a vu le problème que je ne pouvais pas comprendre?

Merci d'avance.

[] 's,

+1

Eh bien le problème n'est pas dans ce code. Postez le code où MemoryPartition est utilisé et peut-être que nous pouvons vous aider. – Goz

+1

Peut-être que vous devez définir votre constructeur de copie et l'opérateur d'affectation de copie? –

+0

Le problème doit se produire ailleurs. Est-ce que Valgrind signale une corruption de tas? Existe-t-il ailleurs où vous allouez/libérez le 'partitionArray' –

Répondre

3

Il est impossible de dire à partir du code ci-dessus.

Mais je suppose que vous devez définir le constructeur de copie et l'opérateur d'affectation.

Voir la règle de 4 (Google/Wiki it).

les opérations suivantes:

class MemoryPartition 
{ 
    // Just add these two lines (keep them private) 
    MemoryPartition(MemoryPartition const&);   // Don't define. 
    MemoryPartition& operator=(MemoryPartition const&); // Don't define. 
<CLASS STUFF AS BEFORE> 
}; 

compilez le code maintenant. Si cela échoue parce que ce qui précède est privé, vous avez accidentellement fait une copie de l'objet quelque part et effectuez une double suppression sur le pointeur.

+0

Je suppose que c'est aussi le cas. –

+1

N'est-ce pas la règle de _3_? – SebastianK

+0

Oui, ça a échoué. Je vais savoir où j'ai fait les mauvaises choses. – Mauren