我有以下问题。 我使用以下函数从缓冲区接收字符串,直到出现换行符。
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 ++。
答案 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
变量,而是动态地(在堆上)创建它,但不使用原始malloc
和free
,如上一个答案中所示,但使用现代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。)