0

プログラムでとらえどころのないバグを見つけたところ、最適化が有効になっていると、次のような場合に、processDocument() がテキストを取得する前に std::string が破棄されることがあることが原因であることが判明しました。

#include <stdio.h>
#include <spawn.h>
#include <string>
static void processDocument(const char* text) {
        const char* const argv[] = {
                "echo",
                text,
                NULL,
        };
        pid_t p;
        posix_spawnp(&p, "echo", NULL, NULL, (char**) argv, environ);
}
static int mark = 'A';
static void createDocument() {
        const char* vc;
        std::string v = "ABCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK42";
        ++mark;
        v[0] = mark;
        vc = v.c_str();
        processDocument(vc);
}
int main() {
        createDocument();
        createDocument();
        return(0);
}

execvp、posix_spawnp などで使用するために std::string を char* に安全に変換するにはどうすればよいですか?

4

1 に答える 1

1

なぜそれが本当にあったのかがわかりました(ここでは実際の最小限のテストケース):

std::string resultString;
const char* nodeText;
const char* altText;
resultString = "......whatever1.";
nodeText = resultString.c_str();
resultString = ".....whatever2..";
altText = resultString.c_str();
printf("%s\n", nodeText); // garbage

悪いアイデア。

于 2012-05-13T12:22:11.237 に答える