简体   繁体   中英

Segfault during C++ array deallocation

I'm getting a weird problem in memory deallocation.

I have the following code for class 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;
}

and the following code for 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;
}

and I'm getting a weird at delete[] in MemoryPartition destructor. Valgrind is telling me there are 13 frees and 10 allocs, but I can't see a reason why this delete[] would be called 3x.

Anyone see the problem I couldn't figure out?

Thanks in advance.

[]'s,

Its impossible to tell from the code above.

But my guess is that you need to define the copy constructor and assignment operator.

See Rule of 4 (Google/Wiki it).

Try the following:

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

Compile the code now. If it fails because the above are private then you have accidentally made a copy of the object somewhere and are doing a double delete on the pointer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM