ホームページ > バックエンド開発 > C++ > C 関数から安全に配列を返し、メモリ リークを回避するにはどうすればよいですか?

C 関数から安全に配列を返し、メモリ リークを回避するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-02 17:57:11
オリジナル
579 人が閲覧しました

How Can I Safely Return Arrays from C   Functions and Avoid Memory Leaks?

C でローカル配列を返す : メモリ リークを回避する

C でローカル配列を返すとメモリ リークが発生する可能性があります。次の例を考えてみましょう。

char *recvmsg() {
    char buffer[1024];
    return buffer;
}

int main() {
    char *reply = recvmsg();
    ...
}
ログイン後にコピー

ここで、recvmsg 関数はローカル配列バッファへのポインタを返します。ただし、この配列は関数が返されるときに破棄され、ダングリング ポインタが残ります。後でこのポインターにアクセスすると、未定義の動作が発生し、メモリ リークが発生する可能性があります。

std::vector を返す

この問題を解決するには、 std::vectorローカル配列の代わりに。 std::vector では、データはコンテナ自体によって動的に割り当てられ、管理されます。したがって、std::vector を返すと、ダングリング ポインタの問題が回避されます。

std::vector<char> recvmsg() {
    std::vector<char> buffer(1024);
    ...
    return buffer;
}

int main() {
    std::vector<char> reply = recvmsg();
}
ログイン後にコピー

std::vector で char* を使用する

コード内の他の場所で char* を使用すると、&reply[0] を使用して、 std::vector。例:

void f(const char* data, size_t size) {}

f(&reply[0], reply.size());
ログイン後にコピー

new の使用を避ける

最後に、new の使用を可能な限り避けることをお勧めします。 new を使用して手動でメモリを管理すると、割り当てられたメモリが適切に割り当て解除されていない場合、メモリ リークが発生する可能性があります。代わりに、メモリを自動的に管理する std::vector のようなコンテナを利用してください。

以上がC 関数から安全に配列を返し、メモリ リークを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート