2

当我遇到内存访问错误时,我正在使用一些 openFrameworks 示例。经过一天缩小问题的范围后,我有一个相当小的相对纯 C++ 代码示例,它仍然会导致内存访问错误。我会在这里发布整个内容,因为它很短。

共有三个文件:testApp.cpp、main.cpp 和 testApp.h。

测试应用程序.h:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class X {
public:

  X();
  virtual ~X();

private:

  vector<string> vertices;
  vector<string> colors;
  vector<string> normals;
  vector<string> texCoords;
  vector<string> indices;
  bool bVertsChanged, bColorsChanged, bNormalsChanged, bTexCoordsChanged, bIndicesChanged;
  int mode;
  string name;

  bool useColors;
  bool useTextures;
  bool useNormals;
};

class testApp{

public:
  void setup();

  X x1;
  X x2;
  vector<string> stroke;
};

测试应用程序.cpp:

#include "testApp.h"

X::X() {}
X::~X() {}

void testApp::setup(){
  std::cout << stroke.size() << std::endl;


}

主.cpp:

#define _GLIBCXX_DEBUG
#include "testApp.h"

int main( ){

    testApp* o = new testApp();
    o->setup();
    std::cout << o->stroke.size() << std::endl;

}

为了编译,我输入:g++ -o testApp testApp.cpp main.cpp. (我正在使用带有股票 g++ 编译器版本 4.6.3、x86_64 架构的 Ubuntu 12.04)。当我运行它时,我得到这个输出:

18446744073709025734
0

第一个数字来自调用 testApp::setup,它打印出 stroke.size()(这显然是不正确的)。第二个数字来自直接打印 stroke.size() 。似乎存在某种内存问题,但我不知道从哪里开始,或者在哪里提交错误。

这似乎只在 testApp 类被完全指定时才会发生。如果您注释掉单个向量(甚至是布尔值),问题就会消失。如果您注释掉,问题也会消失_GLIBCXX_DEBUG,但该标志应该是良性的 AFAIK。有什么建议吗?我应该在哪里提交错误?还是有什么明显的我忽略了?

另外,有人介意在他们自己的计算机/编译器上尝试这个,看看他们是否遇到同样的问题吗?

4

1 回答 1

5

_GLIBCXX_DEBUG可能会更改标准库容器的定义,因此您的程序违反了单一定义规则 (ODR)Xmain.cpp 翻译单元和 testApp.cpp 翻译单元中的定义不同,导致未定义的行为。

于 2012-08-08T19:20:05.413 回答