私はC++コードを持っています。私はそれをコンパイルするためにMSC9を使います。 ランダムにクラッシュし続けます。例えば、 ``を使ってPerlから呼び出された場合、クラッシュしますが、コマンドラインやUltimate ++から呼び出されたときにクラッシュすることはありません。C++の機能を終了するときにプログラムがクラッシュする...それはどう思いますか?
私はそれをperlから呼び出すことを意味します。 f.exe arg1 arg2 arg3
スタックトレースはあまり表示されません。それは、ラインによってプログラムラインが...
を返すときにプログラムが終了時に失敗したことを証明したので、それはその
int funcname()
{
return 0; <-- crashing after that...
}
のようである私は、スタックが破損していると思いますし、スタックした後に巻き戻されるトレースクラッシュ..
何が原因なのですか? プログラムはpcre、stl、iteratorsを使用します。イテレータがスタックを破壊することはできますか? このようなエラーをどのようにキャッチしますか?
コンパイラのバグはありますか?
注:デバッグバージョンクラッシュしていない、唯一のリリースバージョン...
バグは、このP-VECTORクラスに関連しているようです。
struct complexstr
{
pvector<int> v;
string v2;
hash_map<string> hm;
vector<string> vs; // similar
int i;
};
この行ので失敗するようだ:
私はこれに似た構造体を持っている
complexstr s1;
complexstr s2;
s2=s1; // it seems to fail here, if this is not there... there is no error.
私はこの問題は、以下のクラス... STDであると思います::コピーはpvector operator =(const pvector & pv)で正しいですか?
pvectorはperl互換性のあるベクトルです...そのインデックスは、ベクトルの割り当てられたサイズより大きくすることができます。
更新1: 割り当てにリークがあるとの提案がありました。 私はそれが今どのように見えるかで割り当て... 変更:
pvector& operator=(const pvector &pv)
{
delete [] m_rgArray;
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
注:戻り値の型に&を追加することにより、クラッシュがまだ残っていました。 しかし、リークを削除した後、delete [] m_rgArray;を追加してください。 、 プログラムはもうクラッシュしません。分かりません。私が漏れを知っている限り、 はクラッシュしません。だから問題は解決されたようです(?)。疑問符は私の驚きを示しています。 Update2: いいえ、問題は戻ってきました。それはちょっと消えてしまった。 Update3:私はそれを見つけたと思う。正確な場所を見つけるために、gflags.exeとwindbg.exeというMicrosoftのデバッグツールからユーティリティを使用しました。 gflags.exe/p/myprog.exe/fullを有効にしてヒープバグの例外を有効にしました。 現時点では、バグはFindClose(ハンドル)によって発生していると思います。ハンドルは初期値ではなくランダム値でした。
旧バージョン:
template<class _Ty>
class pvector
{
public:
_Ty * m_rgArray; // Declare array
int m_nIndex; // Index to array
int allocated;
_Ty undefvalue;
typedef _Ty value_type;
typedef value_type & reference;
typedef const value_type & const_reference;
typedef custom_iterator<_Ty> iterator;
typedef custom_iterator<_Ty> const_iterator;
typedef int difference_type;
typedef int size_type;
//typedef typename pvector_type_traits<_Ty>::default_value default_value;
pvector() : m_nIndex(0)
{ // init index to 0
m_rgArray = new value_type[10];
allocated = 10;
fill(0);
}
pvector(size_type s) : m_nIndex(0)
{ // init index to 0
size_type defsize = 10;
if (s>10)
{
defsize = s;
}
m_rgArray = new value_type[defsize];
allocated = defsize;
fill(0);
}
pvector(pvector const& pv)
: m_rgArray(new value_type[pv.allocated]),
m_nIndex(pv.m_nIndex),allocated(pv.allocated)
{
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
}
pvector operator=(const pvector &pv)
{
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
void clear()
{
m_nIndex=0;
fill(allocated);
}
~pvector() {
delete []m_rgArray;
}
size_type size() const
{ // return length of sequence
return m_nIndex;
}
size_type max_size() const
{ // return maximum possible length of sequence
return 0;
}
void fill(size_type si)
{
for (size_type i = si;i<allocated;i ++)
{
m_rgArray[i] = pvector_type_traits<_Ty>::default_value();
}
}
bool empty() const
{ // test if sequence is empty
return (m_nIndex > 0 ? false : true);
}
iterator begin()
{ // return iterator for beginning of mutable sequence
return iterator(&m_rgArray[0]);
}
const_iterator begin() const
{
return const_iterator(&m_rgArray[0]);
}
iterator end()
{ // return iterator for end of mutable sequence
return iterator(&m_rgArray[m_nIndex]);
}
const_iterator end() const
{
return const_iterator(&m_rgArray[m_nIndex]);
}
reference operator[](size_type i)
{
if (m_nIndex>i)
{
return m_rgArray[i];
}
else if (i >= allocated)
{
resize(i * 2);
}
m_nIndex = i + 1;
return m_rgArray[i];
}
void resize(size_type s)
{
value_type * m_rgArray2;
size_type old_allocated = allocated;
allocated = s;
m_rgArray2 = new value_type[allocated];
//if (allocated>m_nIndex)
//{
// m_nIndex=allocated;
// }
// cout <<"m_nIndex" << m_nIndex << "allocated" << allocated << endl;
if (m_nIndex>allocated)
{
m_nIndex=allocated;
}
for (size_type i = 0;i<m_nIndex;i ++)
{
m_rgArray2[i] = m_rgArray[i];
}
delete []m_rgArray;
m_rgArray = m_rgArray2;
fill(old_allocated);
}
reference back()
{
return &m_rgArray[m_nIndex - 1];
}
const_reference back() const
{
return m_rgArray[m_nIndex - 1];
}
void push_back(const _Ty &_Val)
{ // insert element at end
if (size() < allocated)
m_rgArray[m_nIndex ++ ] = _Val;
else
{
resize(allocated * 2);
m_rgArray[m_nIndex ++ ] = _Val;
}
}
};
もちろん、それはコンパイラのバグです! :) 関数のコードを投稿すると役に立ちます。 – Indy9000
それは何でもかまいません。いくつかのコードを表示します。このようなエラーをキャッチする最も速いqayは通常、コードを非常に慎重に調べることです。 – nos
ここにいくつかのコードがあります – Aftershock