C++ 在C+;中对new和delete进行过度编码导致通用内存分配崩溃+;

C++ 在C+;中对new和delete进行过度编码导致通用内存分配崩溃+;,c++,C++,我有以下代码。当我删除分配的内存(即Rational::deleteMemPool())时,以下代码崩溃 将输出作为 mempool值为00000000 mempool值为003462E8 mempool值为003462E8 //虽然我们有有效的指针,但这里是用于删除崩溃的 谁能帮帮我这里有什么臭虫吗 #include <string> #include <iostream> template < class T > class MemoryPool {

我有以下代码。当我删除分配的内存(即Rational::deleteMemPool())时,以下代码崩溃

将输出作为

mempool值为00000000 mempool值为003462E8 mempool值为003462E8

//虽然我们有有效的指针,但这里是用于删除崩溃的

谁能帮帮我这里有什么臭虫吗

#include <string>
#include <iostream>


template < class T >
class MemoryPool {
public:
    MemoryPool (size_t size = EXPANSION_SIZE);
    ~MemoryPool ();
    inline void* alloc (size_t size); // Allocate a T element from the free list.
    inline void free (void *someElement); // Return a T element to the free list.
private:
    MemoryPool<T> *next; // next element on the free list.
    enum { EXPANSION_SIZE = 32}; // If the freeList is empty, expand it by this amount.
    void expandTheFreeList(int howMany = EXPANSION_SIZE); // Add free elements to the free list
};

template < class T > MemoryPool < T > :: MemoryPool (size_t size) {
    expandTheFreeList(size);
}

template < class T > MemoryPool < T > :: ~MemoryPool () {
    MemoryPool<T> *nextPtr = next;
    for (nextPtr = next; nextPtr != NULL; nextPtr = next) {
        next = next->next;
        delete [] nextPtr;
    }
}

template < class T > inline void* MemoryPool < T > :: alloc (size_t) {
    if (!next) {
        expandTheFreeList();
    }

    MemoryPool<T> *head = next;
    next = head->next;
    return head;
}

template < class T > inline void MemoryPool < T > :: free (void *doomed) {

    MemoryPool<T> *head = static_cast <MemoryPool<T> *> (doomed);
    head->next = next;
    next = head;
}

template < class T > void MemoryPool < T > :: expandTheFreeList(int howMany) {
    // We must allocate an object large enough to contain the next pointer.
    size_t size = (sizeof(T) > sizeof(MemoryPool<T> *)) ? sizeof(T) : sizeof(MemoryPool<T> *);
    void *pNewAlloc = new char[size];
    MemoryPool<T> *runner = static_cast <MemoryPool<T> *> (pNewAlloc);
    next = runner;
    for (int i = 0; i < howMany ; i++) {
        void *pNewAlloc = new char[size];
        runner->next = static_cast <MemoryPool<T> *> (pNewAlloc);
        runner = runner->next;
    }
    runner->next = 0;
}

class Rational {
public:
    Rational (int a = 0, int b = 1 ) : n(a), d(b) {}
    void *operator new(size_t size) { return memPool->alloc(size); }
    void operator delete(void *doomed,size_t size)  { memPool->free(doomed); }

    static void newMemPool() { 
        std::cout << "mempool value is " << Rational::memPool << std::endl;
        memPool = new MemoryPool <Rational>; 
        std::cout << "mempool value is " << Rational::memPool << std::endl;
    }
    static void deleteMemPool() { 
        std::cout << "mempool value is " << Rational::memPool << std::endl;
        delete memPool; 
    }

private:
    int n; // Numerator
    int d; // Denominator
    static MemoryPool <Rational> *memPool;
};

MemoryPool <Rational> *Rational::memPool = 0;
int main() {

    Rational *array[1000];

    Rational::newMemPool();


    // Start timing here
    for (int j = 0; j < 1; j++) {
        for (int i = 0; i < 10; i++) {
            array[i] = new Rational(i);
        }

        for (int i = 0; i < 10; i++) {
            delete array[i];
        }
    }

    // Stop timing here
    Rational::deleteMemPool();

}

您在删除内存池中的块时遇到问题。分配块时,使用
expandthefleelist(i)
中的
newchar[size]

但是当您删除这些块时,您使用
delete[]nextPtr

template < class T > MemoryPool < T > :: ~MemoryPool () {
    MemoryPool<T> *nextPtr = next;
    for (nextPtr = next; nextPtr != NULL; nextPtr = next) {
        next = next->next;
        delete [] nextPtr;     //  <-- problem
    }
}

似乎使事情不会崩溃。当然,可能还有其他问题。

您在删除内存池中的块时遇到了问题。分配块时,使用
expandthefleelist(i)
中的
newchar[size]

但是当您删除这些块时,您使用
delete[]nextPtr

template < class T > MemoryPool < T > :: ~MemoryPool () {
    MemoryPool<T> *nextPtr = next;
    for (nextPtr = next; nextPtr != NULL; nextPtr = next) {
        next = next->next;
        delete [] nextPtr;     //  <-- problem
    }
}

似乎使事情不会崩溃。当然,可能还有其他问题。

是否有堆栈跟踪?堆栈跟踪:>ReadParsing.exe!Real::DeleTeMeMoPoO()75行C++ + RealPr.NeX.EXE!(107)C++ C++ RealPrace.exe!tmainCRTStartup()行586+0x19字节C ReadParsing.exe!mainCRTStartup()行403 C kernel32.dll!7c817077()我已经为您编辑了您的问题,以易于阅读的格式添加了stacktrace。好的,哪一行是第75行?第75行是delete memPool;在deleteMemPool函数中。是否获得堆栈跟踪?堆栈跟踪:>ReadParsing.exe!Real::DeleTeMeMoPoO()75行C++ + RealPr.NeX.EXE!(107)C++ C++ RealPrace.exe!tmainCRTStartup()行586+0x19字节C ReadParsing.exe!mainCRTStartup()行403 C kernel32.dll!7c817077()我已经为您编辑了您的问题,以易于阅读的格式添加了stacktrace。好的,哪一行是第75行?第75行是delete memPool;在deleteMemPool函数中。
delete [] reinterpret_cast<char*>(nextPtr);