关闭sf :: RenderWindow后检测到堆栈粉碎

时间:2017-11-17 16:52:32

标签: c++ multithreading sfml

我正在编写我的第一个chip8解释器和多线程程序并遇到了这个问题:我一关闭窗口就得到 堆栈被粉碎检测 。我已经检查了很长一段时间的代码,但我找不到问题。真的想要一些帮助或建议。

emulator.hpp

output$lot_of_input <- renderUI({
  inputs <- list( 
    numericInput(inputId = "A","A",1),
    numericInput(inputId = "AB","AB",1),
    numericInput(inputId = "B","C",1),
    numericInput(inputId = "C2","C",1),
    numericInput(inputId = "A3","A",1),
    numericInput(inputId = "AB3","AB",1),
    numericInput(inputId = "B3","C",1),
    numericInput(inputId = "C23","C",1)#, lot of other input
  ) 

  pack( inputs, 4 )
})

emulator.cpp

bool ReadWords::isNextWord() {return !(wordfile.eof()); }

编辑:

#ifndef CHEAP8_SRC_EMULATOR_HPP
#define CHEAP8_SRC_EMULATOR_HPP

#include "chip8.hpp"
#include "ui-settings.hpp"

#include <SFML/Graphics.hpp>

#include <atomic>
#include <memory>
#include <mutex>
#include <string>
#include <thread>

#ifdef _WIN32
#define OS_PATH_SEP '\\'
#else
#define OS_PATH_SEP '/'
#endif

class Emulator
{
    //misc
    const std::string gamePath;
    const std::string gameTitle;

    //emulator
    unsigned char memory[chip8::kMemSize] = {0};

    //flags
    bool gameLoaded = false;
    std::atomic<bool> gameRunning{false};

    //ui
    const double kPixelSize = 12.5;
    std::shared_ptr<sf::RenderWindow> window;
    const UiSettings uiSettings;

    //threading
    std::thread uiThread;
    std::mutex mutex;

    void loadGame();
    void loadFonts();
public:
    explicit Emulator(char*);
    ~Emulator();
    void run();
};

#endif //CHEAP8_SRC_EMULATOR_HPP

1 个答案:

答案 0 :(得分:1)

正在堆栈上创建Emulator的实例,因此它将使用足够的堆栈空间来存储其所有成员变量。

这个很大:

unsigned char memory[chip8::kMemSize] = {0};

您可以将其更改为std::vector,以便将数据存储在堆上,而类实例仅包含元数据(大小,指向数据的指针)。

它还将改变对memory数组的越界访问的影响 - 而不是弄乱堆栈并更改返回地址等内容,将对纯数据对象进行任何损坏。< / p>

为了确保没有越界访问,您可以使用vector的at()成员函数。