我正在编写我的第一个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
答案 0 :(得分:1)
正在堆栈上创建Emulator
的实例,因此它将使用足够的堆栈空间来存储其所有成员变量。
这个很大:
unsigned char memory[chip8::kMemSize] = {0};
您可以将其更改为std::vector
,以便将数据存储在堆上,而类实例仅包含元数据(大小,指向数据的指针)。
它还将改变对memory
数组的越界访问的影响 - 而不是弄乱堆栈并更改返回地址等内容,将对纯数据对象进行任何损坏。< / p>
为了确保没有越界访问,您可以使用vector的at()
成员函数。