Segfault во время освобождения массива C ++ - PullRequest
0 голосов
/ 02 ноября 2010

У меня странная проблема с освобождением памяти.

У меня есть следующий код для класса MemoryPartition:

#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;
}

и следующий код для 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;
}

и я получаю странный при удалении [] в деструкторе MemoryPartition.Вальгринд говорит мне, что есть 13 освобождений и 10 распределений, но я не вижу причины, по которой это удаление [] будет называться 3х.

Кто-нибудь видит проблему, которую я не мог понять?

Заранее спасибо.

[],

1 Ответ

3 голосов
/ 02 ноября 2010

Невозможно сказать по коду выше.

Но я предполагаю, что вам нужно определить конструктор копирования и оператор присваивания.

См. Правило 4 (Google / Wiki it).

Попробуйте следующее:

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>
};

Скомпилируйте код сейчас. Если это не удается из-за того, что приведенное выше является частным, то вы случайно сделали где-то копию объекта и дважды удалили указатель.

...