Tôi cố gắng để biên dịch một chương trình biên dịch hoàn toàn tốt đẹp trên desktop của tôi, nhưng trên máy tính xách tay của tôi, nó biên dịch nhưng mang lại cho tôi lỗi này bất cứ khi nào nó được điều hành:Heap tham nhũng nhưng chỉ khi biên soạn trên máy tính xách tay
Windows có kích hoạt một điểm ngắt trong RR.exe.
Điều này có thể do hỏng heap, cho biết lỗi trong RR.exe hoặc bất kỳ tệp DLL nào đã tải.
Điều này cũng có thể do người dùng nhấn F12 trong khi RR.exe đã tập trung.
Cửa sổ đầu ra có thể có thêm thông tin chẩn đoán.
tôi đã nhận xét ra dòng cho đến khi tôi tìm thấy dòng mà làm cho các lỗi đó là:
if(glfwOpenWindow(width_, height_, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) {
throw std::runtime_error("Unable to open GLFW window");
}
Điều lạ là nếu tôi thay width_
và height_
với các hằng số, ví dụ 800 và 600 tương ứng, nó dừng tham nhũng đống. Ngoài ra nếu tôi chỉ sử dụng các giá trị mặc định được thiết lập bởi hàm tạo thay vì truyền các giá trị, nó sẽ không sụp đổ.
Đây là mã hoàn chỉnh. Các dòng trên nằm trong hàm tạo Window
.
window.h
#pragma once
#include <iostream>
#include <GL\glew.h>
#include <GL\glfw.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "GLFW.lib")
class Window {
public:
Window(unsigned width = 800, unsigned height = 600);
~Window();
void clear();
inline void display() { glfwSwapBuffers(); }
inline bool exit() { return !glfwGetWindowParam(GLFW_OPENED); }
private:
unsigned width_, height_;
};
window.cpp
#include "window.h"
Window::Window(unsigned width, unsigned height) : width_(width), height_(height) {
if(glfwInit() != GL_TRUE) {
throw std::runtime_error("Unable to initialize GLFW");
}
if(glfwOpenWindow(width_, height_, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) { //crash
//if(glfwOpenWindow(800, 600, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) { //no crash
throw std::runtime_error("Unable to open GLFW window");
}
GLenum result = glewInit();
if(result != GLEW_OK) {
std::stringstream ss;
ss << "Unable to initialize glew: " << glewGetErrorString(result);
throw std::runtime_error(ss.str());
}
}
Window::~Window() {
glfwTerminate();
}
void Window::clear() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
main.cpp
#include "window.h"
int main() {
Window wind(1024, 800); //crash
Window wind(800, 600); //crash
Window wind(); //works
return 0;
}
1 để cung cấp một, kiểm tra hợp cụ thể tương đối ngắn hoàn chỉnh. –
bạn đã đảm bảo bạn có chính xác cùng một phiên bản của hệ thống/thời gian chạy DLL trên cả hai máy? –
Chúng là chính xác cùng một DLL, .libs và pro ject như tôi giữ chúng trên dropbox. – Lerp