重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

必要に応じて拡張した配列の要素を全削除します。

CTEST *p;

Break-> for(i = 0; i < this->GetSize();; i++) {
p = (CTEST*)this->GetAt(i);
delete p;
p = NULL;
}
this->RemoveAll();

以上の様にしてみたのですが、デバックモードで削除を実行すると最後まで実行されずに?混合モードになります。
これはなにか悪い事でもしでかしているのでしょうか?
できましたら、今回に限らずステップ実行から混合モードへ移ってします理由を教えていただけるとありがたいです。

A 回答 (2件)

> 一旦勝手にブレイクするのは何故?



ソースを適当に修正して実行してみましたが、私の環境(Win2000,VC++6.0sp?)だと再現しませんでした。
「ブレークポイントの設定位置 0x????」で止まるってのはあまり経験ないですが、「ブレークポイントの設定位置」のキーワードで情報収集すると、デバッグ中にそういう事が起こる例はあるようです。
メモリ破壊でブレークポイントの情報が壊れるってのも考え難いですね。


別の方向から、チェックする項目を上げてみると…

1)
[編集]-[ブレークポイント]でブレークポイントが設定されていないか確認。
データの変化やメッセージを受け取った際にブレークする場合もあるので、そちらも確認。
[すべて削除]で一旦削除してみる。


2)
ブレークした状態で、
[表示]-[デバッグウインドウ]-[コールスタック]を表示し、該当処理を呼び出した処理は?そのときの引数は?そのまた呼び出し元は?と辿ってみる。

--
> デバッグ情報が無いというのはどういう事ですか?

私の環境の例ですが、いきなり[デバッグ]-[ステップイン]を実行すると、
int WINAPI _tWinMain(…)
の関数(Cの場合はmain関数など)が呼び出されます。
インストールの際の設定によりますが、_tWinMain関数の定義されている"appmodul.cpp"ファイルが無い場合や、ソースファイルがあってもexeとcppを関連付けているデバッグ情報が無い場合、プログラムの開始位置で止まっている状況を表示しなければならないが、ソースが分からないという事で、混合モードが表示されます。
動的にリンクしたライブラリの関数(ソースなし)にステップイン、printf関数にステップイン、などすると設定次第ですが混合モードが表示されるハズです。
    • good
    • 0
この回答へのお礼

>動的にリンクしたライブラリの関数(ソースなし)にステップイン、printf関数にステップイン、などすると設定次第ですが混合モードが表示されるハズです

回答ありがとうございました。なんとなく聞いた覚えがあるような・・・、って程度の認識しかありませんでした。

お礼日時:2003/12/12 23:12

CTESTの宣言、該当処理のクラス宣言、関数宣言、など提示してもらわないと、なんとも…。


エラーメッセージなどは表示されないのですか?

--
class CTEST
{};
class CTESTary : public CObArray
{public:void doo();};
void CTESTary::doo()
{該当処理}
void CTest1211Dlg::OnButton1() // 適当なダイアログ
{CTESTary a;a.doo();}

のようにすると、普通に実行されているようでしたが。

--
> ステップ実行から混合モードへ移ってします理由を教えていただけるとありがたいです。

基本的にはデバッグ情報が無い場合です。

この回答への補足

説明不足で申し訳ありません。

class CTEST : public CObArray
{
public:
void Set(const AAA *);
const AAA *Get(int);
void Erase(void);
private:
void Sort(int(*Comp)(CObject *, CObject *),int, int);
};
void CTEST::Set(const AAA *p)
{
AAA *c = new AAA;
*c = *p);
Add((CObject*)c);

Sort(Comp, 0, GetUpperBound());
}
const AAA* CTEST::Get(int i)
{
return((AAA*)GetAt(i));
}
void CTEST::Erase(void)
{
int i;
AAA *p;
for (i = 0; i < GetSize(); i++) {
p = (AAA*)GetAt(i);
delete p;
p = NULL;
}
RemoveAll();
}
CTEST::Sort(Comp, 0, GetUpperBound())
{
// 再帰ソート(省略)
}

AAAというのは自身で用意したクラスで情報群メンバに持ち、メンバ関数で個々の情報を取り出すクラスです。
自分ではソート処理でアドレスを壊してるのかなぁと推測してEraseでダンプしてみたんですが、別におかしくない様に思えました。
最後まで実行されずにというのはEraseで確保した領域を開放していく過程で混合モードに入りメッセージボックスでブレイクポイントの設定位置 アドレスと表示されるということです。一旦勝手にブレイクするのは何故?というのが私の知りたい事です。ちなみにF5で再実行すると何も無かったように正常に終了します。
以上補足したつもりですが、お願いします。

>基本的にはデバッグ情報が無い場合
特に設定をいじらずプロジェクトを作ったつもりですが、デバッグ情報が無いというのはどういう事ですか?聞いてばっかりですみません。

補足日時:2003/12/11 23:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!