簡體   English   中英

C ++程式當機

[英]C++ program crashes down

我正在用C ++做一個項目,當我嘗試運行它時,程序不斷崩潰……這是我的代碼(兩個文件: main.cppPlacementHead.cpp ):

main.cpp中:

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <climits>
#include "PlacementHead.h"

// Main

int main (int argc, char * const argv[]) {

        PlacementHead h1(4,2,1,"aabcbbca");
        PlacementHead h2(4,2,1,"babcabca");

    return 0;
}

PlacementHead.cpp:

#include "PlacementHead.h"
#include <string>
#include <iostream>
#include <string.h>

PlacementHead::PlacementHead(int width, int height, int gap, char* s) {
    width_ = width;
    height_ = height;
    gap_ = gap;
    size_ = width*height;
    set_ = new char[size_];
    from_ = new int[size_];
    original_ = new char[size_];
    strcpy(set_,s);
    strcpy(original_,s);
}

PlacementHead::~PlacementHead() {

}

int PlacementHead::getSize() { return size_; }
int PlacementHead::getHeight() { return height_; }
int PlacementHead::getWidth() { return width_; }
int PlacementHead::getGap() { return gap_; }

char PlacementHead::getNozzle(int i) {
    return set_[i-1];
}

void PlacementHead::setNozzle(int i, char c) {
    set_[i-1] = c;
}

void PlacementHead::markNozzle(int i, int bankPos) {
    set_[i-1] = ' ';
    from_[i-1] = bankPos;
}

int PlacementHead::getNextUnmarkedPos() {
    for (int i=0; i<size_; i++) {
        if (set_[i]!=' ') {
            return i+1;
        }
    }
    return 0;
}

int PlacementHead::getBankPos(int i) {
    return from_[i-1];
}

void PlacementHead::reset() {
    //for (int i=0; i<size_; i++) {
    //  set_[i] = original_[i];
    //}
    strcpy(set_,original_);
}

void PlacementHead::print() {
    std::cout << "placementhead:\n";
    for (int h=height_; h>0; h--) {
        for (int w=width_; w>0; w--) {
            int i = ((h-1)*width_)+w;
            std::cout << getNozzle(i);
        }
        std::cout << "\n";
    }
}

如果我嘗試運行main.cpp,則會得到以下信息:

在此處輸入圖片說明

一旦我也得到了這個(我不是每次都得到這個,這讓我很煩...):

在此處輸入圖片說明

現在這也是要考慮的一件事:如果我注釋掉創建PlacementHead h2-object的第二行,代碼可以正常運行,但是如果我創建多個PlacementHead-objects,程序將再次崩潰...

任何建議可能是什么原因造成的? 感謝您的任何幫助!! =)

PS

我的平台是Windows 7,Codeblocks 12.11和GNU GCC編譯器

更新:

如果您看不到第二張圖片上的文字,則為:

在此處輸入圖片說明

size_ = width*height; 應該是size_ = (width*height)+1; 因此該字符串可以以null結尾。 當前,您正在寫入未分配的內存,導致未定義的行為

你應該

  • size_增加+1也要避免緩沖區溢出(或者使用std::vector代替,請參見下文)
  • 禁用副本構建/分配
  • 添加適當的析構函數
  • 使用初始化列表
  • 檢查成員的聲明順序(因為這也是成員初始化的順序!)
  • 刪除默認構造函數,因為它不會初始化單個成員
  • 在現代編譯器中包含<cstring>而不是<string.h> (因此您可以獲得名稱空間C標准庫函數)

考慮使用std::vector代替手動數組。 這將為您節省很多麻煩。 想一想如何使構造函數異常安全?

這是修復以上所有問題的示例:

#include <iostream>
#include <vector>
#include <cstring>

struct PlacementHead {
    int width_, height_, gap_;
    size_t size_;

    std::vector<char> set_, original_;
    std::vector<int> from_;

    PlacementHead(int width, int height, int gap, const char* s) :
        width_(width),
        height_(height),
        gap_(gap),
        size_(width * height),
        set_(s, s + std::min(strlen(s), size_)),
        original_(set_),
        from_(size_)
    {
        set_.resize(size_);
        original_.resize(size_);

    }

    size_t getSize() { return size_; }
    int getHeight() { return height_; }
    int getWidth() { return width_; }
    int getGap() { return gap_; }

    char getNozzle(int i) { return set_[i - 1]; }

    void setNozzle(int i, char c) { set_[i - 1] = c; }

    void markNozzle(int i, int bankPos) {
        set_[i - 1] = ' ';
        from_[i - 1] = bankPos;
    }

    int getNextUnmarkedPos() {
        for(unsigned i = 0; i < size_; i++) {
            if(set_[i] != ' ') {
                return i + 1;
            }
        }
        return 0;
    }

    int getBankPos(int i) { return from_[i - 1]; }

    void reset() {
        //for (int i=0; i<size_; i++) {
        //  set_[i] = original_[i];
        //}
        set_ = original_;
    }

    void print() {
        std::cout << "placementhead:\n";
        for(int h = height_; h > 0; h--) {
            for(int w = width_; w > 0; w--) {
                int i = ((h - 1) * width_) + w;
                std::cout << getNozzle(i);
            }
            std::cout << "\n";
        }
    }
};

// Main

int main (int argc, char * const argv[]) {

    PlacementHead h1(4,2,1,"aabcbbca");
    PlacementHead h2(4,2,1,"babcabca");

    return 0;
}

您的構造函數中存在一個錯誤的錯誤,因為您嘗試復制的字符串不是 8個字符,而是9個。原因是所有字符串文字都還包含一個額外的特殊字符串終止字符。

如果您在C ++中使用字符串,請使用std::string ,它將極大地幫助您解決此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM