2016-04-28 30 views
1

私は何時間もこれを理解しようとしてきましたが、私は気分がいいです。誰かが私が間違っていると私に言うことができれば、私は確かにそれを感謝します。クラスデストラクターのヒープ破損?

私は単純なスタックを実装しているクラスでC++コードを書いて、ランダムなストリームのストリームをプッシュしてポップしようとしました。正常に動作するようですが、ファイルの末尾に、それはランタイムエラーのいくつかの並べ替え生成:

HEAP CORRUPTION DETECTED: after Normal block....

をエラーは、ファイルの末尾に発生するので、私の推測があるということですポインタを削除する際の問題(クラスデストラクタ)。しかし、私が書いたデストラクタに何が間違っているのか分かりません。

また、いくつか試行錯誤した結果、符号なし整数値iter1(例:80)より大きな数値を指定すると、実行時エラーが発生しないことがわかりました。ここで何が問題なのか、それを回避する方法を説明できますか?

stack.h:

class sstack 
{ 
public: 
    sstack(int length = 256); 
    ~sstack(void); 
    int sstackPop(char &c); 
    int sstackPush(char c); 
    bool isempty(); 
    bool isFull(); 

protected: 
private: 
    char *sstackBuffer; 
    int sstackSize; 
    int sstackIndex; // Initial = -1 
}; 

がstack.cpp:

#include "stack.h" 
#include <iostream> 
using namespace std; 

sstack::sstack(int length) 
{ 
    sstackIndex = -1; 
    if (length > 0) 
     sstackSize = length; 
    else 
     sstackSize = 256; 

    sstackBuffer = new char[sstackSize]; 
} 

sstack::~sstack(void) 
{ 
    delete[] sstackBuffer; 
} 

bool sstack::isempty() 
{ 
    if (sstackIndex < 0) 
    { 
     cout << "is empty!(isempty)" << endl; 
     return 1; 
    } 
    else 
     return 0; 
} 

bool sstack::isFull() 
{ 
    if (sstackIndex >= sstackSize) 
     return 1; 
    else 
     return 0; 
} 


int sstack::sstackPop(char &c) 
{ 
    if (!isempty()) 
    { 
     c = sstackBuffer[sstackIndex--]; 
     cout << sstackIndex << endl; 
     return 1; 
    } 
    else 
    { 
     cout << "is empty!(sstackPop)" << endl; 
     return 0; 
    }  
} 

int sstack::sstackPush(char c) 
{ 
    if (!isFull()) 
    { 
     sstackBuffer[++sstackIndex] = c; 
     return 1; 
    } 
    else{ 
     return 0; 
    } 

} 

main.cppに:スタック

#include <iostream> 
#include "stack.h" 
#include <string> 
using namespace std; 

int main(){ 
    unsigned int iter1 = 5; 
    unsigned int iter2 = 800; 

    sstack stackDefault; 
    sstack stack1(iter1); 
    sstack stack2(iter2); 

    char buffer[80]; 
    memset(buffer, 0x00, 80); 
    char BUFFER[80] = "A random stream of characters"; 
    strcpy_s(buffer, 80, BUFFER); 

    for (int i = 0; i< strlen(buffer); i++) 
    { 
     cout << " stack1: " << stack1.sstackPush(buffer[i]); 
     cout << " stack2: " << stack2.sstackPush(buffer[i]); 
     cout << " stackD: " << stackDefault.sstackPush(buffer[i]); 
     cout << " i : "<< i << endl; 
    } 

    cout << "out of Pushes" << endl; 

    int i = 0; 
    memset(buffer, 0x00, 80); 
    while (!stack1.isempty()) 
     stack1.sstackPop(buffer[i++]); 

    cout << buffer << endl; 
    getchar(); 

} 

答えて

3

sstackBuffer[++sstackIndex] = c;

はsstackBufferの終わりを過ぎて書きます1つの要素だけが残っています。

あなたがその行をプッシュする最初の呼び出しではサイズ1のスタックを考慮した場合に評価されます:あなたが割り当てられてきたメモリを超えている

sstackBuffer[1] = c;

pre-increment and post-incrementの演算子の違いに注意してください。あなたのコード例では、プッシュでポストインクリメントを、ポップでプリインクリメントを使用することをお勧めします。

+0

ご確認いただき、ありがとうございます! –