2

メモリアクセスエラーが発生したとき、私はいくつかのopenFrameworksの例で作業していました。問題を絞り込んだ1日後、比較的純粋なC ++コードの非常に小さなサンプルがありますが、それでもメモリアクセスエラーが発生します。かなり短いので、ここに全部投稿します。

testApp.cpp、main.cpp、およびtestApp.hの3つのファイルがあります。

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;
};

testApp.cpp:

#include "testApp.h"

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

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


}

main.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ました。(私はUbuntu12.04とストックg++コンパイラバージョン4.6.3、x86_64アーキテクチャを使用しています)。実行すると、次の出力が得られます。

18446744073709025734
0

最初の数値は、testApp :: setupを呼び出すことで得られます。これにより、stroke.size()が出力されます(これは明らかに正しくありません)。2番目の数値は、stroke.size()を直接出力することで得られます。ある種のメモリの問題があるようですが、どこから始めればよいのか、どこでバグを報告できるのかわかりません。

これは、testAppクラスが以前とまったく同じように指定されている場合にのみ発生するようです。単一のベクトル(またはブール値)をコメントアウトすると、問題は解決します。コメントアウトすれば問題も解決します_GLIBCXX_DEBUGが、そのフラグは良性のAFAIKであると考えられます。何かアドバイス?どこにバグを報告すればよいですか?それとも私が見落としている明らかな何かがありますか?

また、同じ問題が発生するかどうかを確認するために、自分のコンピューター/コンパイラーでこれを試してみませんか?

4

1 に答える 1

5

_GLIBCXX_DEBUG標準ライブラリコンテナの定義が変更される可能性があるため、プログラムは単一定義規則(ODR)に違反しています。の定義はX、main.cpp変換ユニットとtestApp.cpp変換ユニットで異なり、未定義の動作が発生します。

于 2012-08-08T19:20:05.413 に答える