这是一个g ++ bug,libc bug,还是我疯了(或者全是三个)?

noi*_*lla 2 c++ stl g++

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

有三个文件:testApp.cpp,main.cpp和testApp.h.

testApp.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;
};
Run Code Online (Sandbox Code Playgroud)

testApp.cpp:

#include "testApp.h"

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

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


}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#define _GLIBCXX_DEBUG
#include "testApp.h"

int main( ){

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

}
Run Code Online (Sandbox Code Playgroud)

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

18446744073709025734
0
Run Code Online (Sandbox Code Playgroud)

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

这似乎只有在指定testApp类时才会发生.如果你注释掉一个向量(甚至是一个bool),问题就会消失.如果你注释掉这个问题也会消失_GLIBCXX_DEBUG,但那个标志应该是良性的AFAIK.有什么建议?我应该在哪里提交错误?还是有一些我忽略的明显事物?

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

Jam*_*lis 5

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