1

次の問題があります。次の関数を使用して、改行が発生するまでバッファーから文字列を受け取ります。

string get_all_buf(int sock) {
    int n = 1, total = 0, found = 0;
    char c;
    char temp[1024*1024]; 
    string antw = "";

    while (!found) {
        n = recv(sock, &temp[total], sizeof(temp) - total - 1, 0);
        if (n == -1) {

            break;
        }
        total += n;
        temp[total] = '\0';
        found = (strchr(temp, '\n') != 0);

        if (found == 0){
        found = (strchr(temp, '\r\n') != 0);
        }
    }
    antw = temp;

    size_t foundIndex = antw.find("\r\n");
    if (foundIndex != antw.npos)
    antw.erase ( antw.find ("\r\n"), 2 );

    foundIndex = antw.find("\n");
    if (foundIndex != antw.npos)
    antw.erase ( antw.find ("\n"), 2 );

    return answ;
}

したがって、次のように使用します。

string an = get_all_buf(sClient);

exeファイルを作成すると、すべてが完全に機能します。しかし、dll を作成して rundll32 を使用して実行すると、アプリケーションは " string an = get_all_buf(sClient);" で終了し、エラー メッセージは表示されません...

私はこれを何時間も修正しようとしましたが、現在は少し必死です...

PS 明らかなエラーや不適切なコーディング スタイルで申し訳ありません。C++ の学習を始めたばかりです。

4

2 に答える 2

3
char temp[1024*1024]; 

スタック上で1Mb構造を宣言します。これは大きすぎて、使用可能なスタックメモリがオーバーフローする可能性があります。代わりに静的スコープを与えることができます

static char temp[1024*1024]; 

または動的に割り当てます

char* temp = (char*)malloc(1024*1024);
// function body
free(temp);

または、run32.dllについての言及が、Windowsで作業していることを意味すると仮定すると、/ STACKリンカーオプションを使用して、スタックに保持することを検討できます。これはおそらく最善のアプローチではありません。ビルド設定を変更したり、他のプラットフォームをターゲットにしようとしたりすると、問題が発生することがすでにわかっています。

于 2013-03-01T10:55:12.537 に答える
1

スタック上に変数を作成する代わりに、temp動的に (ヒープ上に) 変数を作成しますが、rawmallocを使用せずfree、前の回答で示したように、最新の C++ と を使用しますstd::vector

#include <vector>

std::vector<char> temp(1024*1024);

これは例外に対して安全であり、割り当てられたメモリを解放するために注意を払う必要はありませstd::vectorん。

の代わりにsizeof(temp)、コードで使用できますtemp.size()(これはベクトル内の要素の数を返します。これはchars のベクトルであるため、ベクトルの合計サイズをchars 単位、つまりバイト単位で返します)。

生の C 配列の場合と同様に、operator[]forを引き続き使用できます。std::vector

また、 DLLをビルドしていて、上記の関数が DLL インターフェースで公開されている場合、この関数は境界で STL クラス ( ) を持つ C++ インターフェースを持っているstd::stringため、DLL とクライアントの両方がビルドされていることに注意する必要があります。同じ CRTへの動的リンク、および同じコンパイラ同じコンパイラ設定(たとえば、VS2008/VC9 でビルドされた DLL と VS2010/VC10 でビルドされた .EXE を混在させることはできません。同じコンパイラでビルドされた debug-build EXE)。

于 2013-03-01T11:27:29.133 に答える