C ++ Dll字符串函数崩溃

时间:2013-03-01 10:51:45

标签: c++ string sockets dll crash

我有以下问题。 我使用以下函数从缓冲区接收字符串,直到出现换行符。

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);”处关闭而不会显示任何错误消息...

我试图解决这个问题几个小时了,我现在有点绝望了......

P.S。对于明显的错误或编码风格不好,我刚开始学习C ++。

2 个答案:

答案 0 :(得分: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链接器选项调查将其保留在堆栈中。这可能不是最好的方法 - 当您更改构建设置或尝试定位其他平台时,您已经发现它会导致问题。

答案 1 :(得分:1)

我没有在堆栈上创建temp变量,而是动态地(在堆上)创建它,但不使用原始mallocfree,如上一个答案中所示,但使用现代C ++和 std::vector

#include <vector>

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

这是异常安全的,你不必注意释放分配的内存:std::vector的析构函数会自动执行 (同样抛出异常)

而不是sizeof(temp),您可以在代码中使用temp.size()(它将返回向量中元素的数量,因为这是char s的向量,它将返回char s中的总向量大小,即以字节为单位。)

您仍可以operator[]使用std::vector,就像使用原始C数组一样。

另请注意,如果要构建 DLL ,并且在DLL接口上公开了上述函数,因为此函数具有带有STL类的 C ++接口(std::string )在边界,您必须注意您的DLL和客户端都使用动态链接构建到相同的CRT ,并且相同的编译器相同的编译器设置(例如,您不能将使用VS2008 / VC9构建的DLL与使用VS2010 / VC10构建的.EXE混合,或者使用发布版本的DLL混合使用使用相同的编译器构建的debug-build EXE。)