0

問題は次のとおりです。

ポインターが引数であるコンストラクターの呼び出しがあります

 m_pszBuf= new char[260];
//Still valid , to prove i'm printing the address
    std::cout <<"Address "<< (void*)m_pszBuf <<std::endl;
    device = new Device(m_pszBuf);


Device::Device(char* _ptr){
strcpy(dest,_ptr);
}

興味深いことに、コンストラクターの呼び出し前は、ポインターはまだ有効でアドレスと値を持っていますが、ctor に入るとすぐに不良ポインター (0x0000005c) になります。また、デバッグ モードでは動作しますが、リリース モードでは動作しません。

4

2 に答える 2

4

m_pszBuf次のように初期化します。

m_pszBuf = new char[260];

Device次に、次のようにコンストラクターを呼び出します。

device = new Device(m_pszBuf);

Deviceコンストラクター内では、ソースstrcpyからの呼び出しがあります。m_pszBuf

Device::Device(char* _ptr) // _ptr == m_pszBuf
{
    strcpy(dest, _ptr);
}

ただし、m_pszBufNUL で終了していない場合strcpy、割り当てられたバッファーの最後で停止せず、範囲外のメモリからガベージをコピーでき、destバッファーをオーバーランする可能性があります。

したがって、コンストラクターに渡す前にm_pszBuf、それがNUL で終了していることと、宛先ポインターが十分な大きさであることを確認してください。Devicestrcpy

: この分析は、表示されたコード スニペットのみに基づいています。(他の問題があることを示すために省略した実際のコードであるかどうかはわかりません。)

于 2013-02-28T11:17:12.147 に答える
0

素晴らしい入力ですが、他の方法で解決しました。ライブラリに使用された「非同期」のヘッダーファイルがいくつかありました。それらを更新する必要がありました。これが他の何かにどのように影響したかは奇妙です。

于 2013-02-28T12:57:21.040 に答える