free:使用可变参数函数在tcache 2中检测到双倍free

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?