如何解决free:使用可变参数函数在tcache 2中检测到双倍free
我想知道你们中的任何人是否可以回答我目前面临的问题。
在我用g ++编译代码而没有任何问题之后,我尝试执行该文件。我用SFML编程的窗口打开了很短的时间,然后就关闭了。我的终端给了我这个错误:
free(): double free deteted in tcache 2
这样的编译命令:
g++ main.cpp CObject.hpp CObject.cpp CFramework.hpp CFramework.cpp -o main.exe -lsfml-graphics -lsfml-window -lsfml-system
以及类似的代码:
CObject.hpp:
#include <SFML/Graphics.hpp>
#ifndef COBJECT_HPP
#define COBJECT_HPP
class CObject{
public:
CObject();
~CObject();
void init(void);
template <typename T,typename... Ts>
void init(T vertex,Ts... vertex1);
void setColor(sf::Color color);
int m_vertexCount;
sf::Vertex *m_vertexArray;
};
#endif
#include "CObject.tpp"
CObject.cpp:
#include "CObject.hpp"
CObject::CObject(void){
m_vertexCount = 1;
m_vertexArray = (sf::Vertex*) malloc(m_vertexCount * sizeof(sf::Vertex));
if(m_vertexArray == NULL){exit(EXIT_FAILURE);}
}
CObject::~CObject(void){
free(m_vertexArray);
}
void CObject::init(void){
if(m_vertexArray == NULL){exit(EXIT_FAILURE);}
}
void CObject::setColor(sf::Color color){
for(int i = 0; i < m_vertexCount; i++){
m_vertexArray[i].color = color;
}
}
COBject.tpp:
template <typename T,typename... Ts>
void CObject::init(T vertex,Ts... vertex1){
if(m_vertexCount == 1){
m_vertexArray[0] = (sf::Vertex) vertex;
m_vertexCount += 1;
m_vertexArray = (sf::Vertex*) realloc(m_vertexArray,m_vertexCount * sizeof(sf::Vertex));
if(m_vertexArray == NULL){ exit(EXIT_FAILURE); }
}else{
m_vertexArray[m_vertexCount-1] = (sf::Vertex) vertex;
m_vertexCount += 1;
m_vertexArray = (sf::Vertex*) realloc(m_vertexArray,m_vertexCount * sizeof(sf::Vertex));
if(m_vertexArray == NULL){ exit(EXIT_FAILURE); }
}
init(vertex1...);
}
CFramework.hpp:
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "CObject.hpp"
#ifndef CFRAMEWORK_HPP
#define CFRAMEWORK_HPP
class CFramework{
public:
CFramework();
void init(int windowWidth,int windowHeight);
void reset();
void renderVertex(CObject object);
void display();
void close();
sf::Event::EventType getEvent();
sf::Event getKeypressed();
void handleWindowEvent(sf::Event::EventType windowEvent);
static CFramework* getInstance();
bool windowIsAlive;
protected:
sf::RenderWindow window;
sf::Event event;
private:
static CFramework* Framework;
};
#endif
CFramework.cpp:
#include "CFramework.hpp"
CFramework::CFramework(){
windowIsAlive = false;
}
CFramework* CFramework::Framework = NULL;
CFramework* CFramework::getInstance(){
if(Framework == NULL){
Framework = new CFramework;
}
return Framework;
}
void CFramework::init(int windowWidth,int windowHeight){
window.create(sf::VideoMode(windowWidth,windowHeight),"Physics Simulation");
windowIsAlive = true;
}
void CFramework::close(){
window.close();
}
void CFramework::display(){
window.display();
}
void CFramework::reset(){
window.clear();
}
void CFramework::handleWindowEvent(sf::Event::EventType windowEvent){
if(windowEvent == sf::Event::Closed){
close();
windowIsAlive = false;
}
}
sf::Event::EventType CFramework::getEvent(){
window.pollEvent(event);
return event.type;
}
void CFramework::renderVertex(CObject object){
window.draw(object.m_vertexArray,object.m_vertexCount,sf::TriangleStrip);
}
最后是main.cpp:
#include "CFramework.hpp"
CFramework* Framework = CFramework::getInstance();
int main()
{
CObject object;
object.init(sf::Vertex(sf::Vector2f(10.f,20.f),sf::Color::Red),sf::Vertex(sf::Vector2f(20.f,30.f),sf::Color::Red));
Framework->init(600,800);
while(Framework->windowIsAlive == true){
sf::Event::EventType eventType = Framework->getEvent();
Framework->handleWindowEvent(eventType);
Framework->reset();
Framework->renderVertex(object);
Framework->display();
}
return 0;
}
我认为我的问题出在CObject文件中,但是我仍然找不到它。
感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。