第一件事:不要混合malloc()和delete []。他们可能会或可能不会引用相同的内存分配器。所以使用malloc()/ free()或new char []/delete []对。
问题出在这里(在Database()函数中):你有一个可怕的memleak。不要像这样分配内存来传递结果。更好使用缓冲区。你的程序是多线程的,所以使用堆栈上的缓冲区。不要在任何你未分配的东西上调用delete [](var声明,如“char Buf [100];”是而不是的分配)。
新版本(I省略main()和条带()函数还包括的):
#define MAX_ECHO_SIZE (1024)
#define MAX_RESPONSE_SIZE (1024)
void process_http(int sockfd, const char *host, const char *page, const char *poststr, char* OutResponse)
{
char* ptr;
char sendline[MAXLINE + 1], recvline[MAXLINE + 1];
ssize_t n;
snprintf(sendline, MAXSUB,
"POST %s HTTP/1.0\r\n" // POST or GET, both tested and works. Both HTTP 1.0 HTTP 1.1 works, but sometimes
"Host: %s\r\n" //oth HTTP 1.0 HTTP 1.1 works, but sometimes HTTP 1.0 works better in localhost type
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-length: %d\r\n\r\n"
"%s\r\n", page, host, (unsigned int)strlen(poststr), poststr);
if (write(sockfd, sendline, strlen(sendline))>= 0)
{
while ((n = read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[n] = '\0';
if(fputs(recvline,stdout) ==EOF) { cout << ("fputs erros"); }
ptr = strstr(recvline, "\r\n\r\n");
strip(ptr, "\r\n\r\n");
// check len for OutResponse here ?
snprintf(OutResponse, 6000,"%s", ptr);
}
}
}
int Database(const char * hname, const char * page, const char * var, const char * poststr, int port, char* EchoResponse, int MaxEchoLen){
char url[MAXLINE];
char response[MAX_RESPONSE_SIZE];
snprintf(url, MAXLINE, "%s=%s", var, poststr);
short int sockfd ;
struct sockaddr_in servaddr;
struct hostent *hptr;
char str[MAXLINE];
char** pptr;
hptr = gethostbyname(hname);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (!hptr) {
cout << ("host not found\n");
return -1; // "host not found";
}
if (hptr->h_addrtype == AF_INET && (pptr = hptr->h_addr_list) != NULL) {
inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str));
}
if (sockfd >= 0 ) {
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, str, &servaddr.sin_addr);
if (connect(sockfd, (SA *) & servaddr, sizeof(servaddr)) < 0) {
return -2; // "Server down, connect error";
}
else {
process_http(sockfd, hname, page, url, &response[0], MAX_RESPONSE_SIZE);
int len = strlen(response)+1;
if(len >= MaxEchoLen) { return -3; /* buffer too small*/ }
// Copy the contents with
strcpy(EchoResponse, response);
/// You must not free all of char[] allocated on stack
close(sockfd);
return 0; // OK
}
}
}
void *multithreading1(void *ptr) {
char LocalEchoResponse[MAX_ECHO_SIZE];
while (1) {
int RetCode = Database("2.107.xx.xxx", "/ajax.php", "submit", "HEllo WORLD", 80, &LocalEchoResponse[0], MAX_ECHO_SIZE);
/// check the error
}
}
这里的一个特技:只使用的C或C++之一。这段代码是两个糟糕的坏坏混合物。它不会仅调用未定义的行为*,因为它存在泄漏*并且不良清理代码从不运行。 –
我同意你的看法,但我试图修复大内存泄漏第一个 – user1417815
问题是在数据库()函数 - memleak在最后,看到我的答案。您也可以通过删除这些例程中未使用的strip_copy()来清除代码。 –