について教えてほしいことC++による削除の問題なのか。
-
23-09-2019 - |
質問
私は、以下のコード:
std::string F()
{
WideString ws = GetMyWideString();
std::string ret;
StringUtils::ConvertWideStringToUTF8(ws, ret);
return ret;
}
WideStringは第三者のクラスでStringUtils.このブラックボックです。第二のパラメータが渡されます。
私は、デバッガのライン return ret
投ルコビーチのポップアップ(Visual C++)とヒープが破損しています。意見のコピー文字列が返されたものでもOKですが、データの削除 ret
失敗します。 ret
を含む正しい値を返します。
ものに変換する機能の違いを起こす。そのアイデアを固定?
更新:
- プロジェクト自体はdll
- StringUtilsはリチウムイオン電池(lib)
- プロジェクトが対応し下記からダウンロードできまCRT(デバッグ、dll)
- プログラムらしい実行時は外国の映像スタジオ
解決
- まStringUtilsため別途(例えば、異なるコンパイラのバージョンとして、紛争のオブジェクトをレイアウト。
- まStringUtilsはDLLするための両方で、本プログラム作成の標準ライブラリは、DLL.そうでない場合、モジュール(実行ファイルおよびDLL)においても重要なのは、ヒープ.時StringUtilsるところのデータの文字列が割り当てられたとは異なるヒープ、自然にまかせるってこと。
他のヒント
デザイナーのStringUtilsの設計は非常に貧しいAPIとなります。の分子を鋳型とした標準ライブラリの種類は使用するAPIの公開インタフェース。 std::string
吹出し、インライン.ここでは、コンパイラー&ライブラリを使用しない全く同じコンパイラー&ライブラリのapiのStringUtilsの種類できると思われがなければならないと思います。基本的には、実装者がのStringUtils 失敗の分からインタフェースの実施.
イラストの問題です。例えば、皆さんが利用MSVC9.0SP1および使用していMSVC8.0.自分のコンパイラの実装std::stringこのような
class string
{
// : : stuff
private:
int someInt_;
char* someBuf_;
};
...がコンパイラこれによって見え方が変わる:
class string
{
// : : stuff
private:
void* impl_;
};
場合は書いているライブラリ関数:
void DoSomethingWithAString(std::string& str);
...お電話での sizeof(string)
コードですが通るまで目が離せない点は大変に sizeof(string)
私のコードです。の種類は同じではありません。
まだ2つのソリューションの問題:
1)[優先]のapiのStringUtils修正は彼の折れたコードです。
2)交換図書館の利用によるコンパイラに合わせて図書館利用StringUtilの実装者が決定します。ることができるかもしれませこのためにするか、又はこれと同等以上のコンパイラのパッチレベルとしてのapiの使用を想定し、はっきり置き換え標準の実装では図書館があります。
編集:3つ目のオプションは使用を中止しStringUtils.正直これが本思います。
から少しのコードするのではないか StringUtils::ConvertWideStringToUTF8()
か std::string&
として、第二のパラメータとします。このように思うコードの原因となりのヒープ破損す
ただし、リンクのC++ライブラリを一にしているときだけallsのコードのためのコンパイラと同じコンパイラを設定します。
ご利用の StringUtils
や WideString
このように見えしましょうC++ビルダを構築します。しようとしていませミックスa C++ビルダーモジュールやVisual C++のモジュール?そのような場合は、まいの問題だけを記述する。
できません-パスのサンプルシミュレーション std::string
C++ビルダーのニーズが高まったことから、C++Builderコードはパラメータを使C++Builderの std::string
定義で設定します。の授業が、異分野の分野から買う→買うから上がるが異なる。
場合においても授業の定義は、モジュールは別のメモリマネージャ。るという機能メモリを割り当てのための新しい文字列を使用したコンテンツ、そのメモリマネージャの呼び出し側が利用は、独自のメモリマネージャーを図り、文字列の内容です。