0

この問題に関連する 3 つのファイルがあります。file.h、file.C、および user.C。

file.h には、プライベート メンバ fstream ログがあります。

file.C のコンストラクターで、ログを開きます。コンストラクターではこれを行いませんが、コンストラクターは関数 OpenLog() を呼び出します。

file.h にはインライン クローズ関数もあります。

CloseLog() {if (ログ) logs.close();}

ファイル user.C には、ファイルのインスタンスを作成してから CloseLog を呼び出す終了関数があります。この時点で障害をセグメント化します。他にもいくつかのダミー テストを作成しましたが、ログがどこかで失われているように見えます...

file.C から user.C に移動してから file.C に戻ると、これが発生します。file.C にグローバルとして fstream ログがある場合は動作しますが、グローバルは避けたいと思います。

ここで何をすべきかについて何か考えはありますか?これについてさらにコードを投稿する必要がある場合はお知らせください。これをより適切にデモするためにダミーのものをセットアップできます。

** リクエストに応じて追加のコードを示します - コピーして貼り付けることはできません。不足していることをお許しください **

クラス helpME.h、helpME.C、および user.C を呼び出します。

//helpME.h
#ifndef _helpME_H
#define _helpME_H

#include < iostream>
#include < fstream>
//さまざまなインクルード

クラス helpME {
プライベート:
fstream ログ;

public:
void CloseLog() {if (ログ) logs.close();}
};
#endif

//helpME.h の終了

//helpME.C
void helpME::helpME(int argc, char** argv)
{
//各種コード
OpenLog();
}

void helpME::OpenLog()
{
//logname は上に設定されています。前に、これが正しいことを示す print ステートメントがありました
。 logs.open(logname, ios::in | ios::out | ios::trunc);
}

//helpME.C の終了

//user.C
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;
hME->CloseLog();
}

//エンドユーザー.C

繰り返しますが、明確でないことをお許しください。これを追加することで、さらに混乱を招く可能性があると思います...このコードは別のボックスにあり、コピーすることはできません.

4

2 に答える 2

0
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;

これはインスタンスを作成しません。Cスタイルのキャストを使用して、任意のアイテムからへのポインターにキャストしますhelpME

itemがNULLの場合、そのアイテムでメソッドを呼び出すと、seqfaultが発生します。

そうでなければ、あなたの例ではまだ答えを出すのに十分な詳細がないので、存在するコードは正しいようです。

于 2010-07-14T21:47:43.143 に答える
0

.h ファイルで変数を宣言したので、その 2 つのコピーがあります。コンパイラは.hファイルを「見る」のではなく、ファイルの内容を.Cファイルにコピー/貼り付けするだけなので、変数のコピーが2つあるのはそのためです。

extern.h ファイルのように変数を宣言し、extern.C ファイルを 1 つだけ使用せずに再度static宣言し、そのファイルの宣言では使用しないでください。問題が解決するはずです。

于 2010-07-14T20:57:48.023 に答える