C ++数组释放期间的Segfault

时间:2010-11-02 18:10:31

标签: c++ gdb g++ valgrind segmentation-fault

我在内存释放中遇到了一个奇怪的问题。

我有类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析构函数中的delete []有点奇怪。 Valgrind告诉我有13个释放和10个分配,但我看不出这个删除[]被称为3x的原因。

有人看到我无法弄清楚的问题吗?

提前致谢。

[]的,

1 个答案:

答案 0 :(得分:3)

从上面的代码中无法分辨出来。

但我的猜测是你需要定义复制构造函数和赋值运算符。

参见规则4(谷歌/维基)。

尝试以下方法:

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

立即编译代码。如果由于上面是私有的而失败,那么你不小心在某处制作了一个对象的副本,并且正在对指针进行双重删除。