두 개의 스레드를 포함하여, 다음 코드를하시기 바랍니다 고려 buffering_thread (하나의 메시지 버퍼 포인터를 채워)과 sending_thread 사이의 메모리 누수가 (버퍼를 비 웁니다)이 있습니까 :두 개의 스레드 (비우기 버퍼링)
#include "msg.cpp"
msg * buffer= NULL;
byte * send_bytes= NULL;
bool keep_buffering = true;
bool keep_sending = true;
int counter = 0;
void start_buffering() {
while (keep_buffering){
while (buffer != NULL && keep_buffering){}
msg m (counter);
buffer = &m;
counter ++;
}
std::cout << "Finished start_buffering" << std::endl;
}
void sending() {
while (keep_sending){
if (counter > 10){
keep_buffering = false;
break;
}
if (buffer != NULL){
HeaderType messageHeader = buffer -> getHeader();
print(messageHeader);
send_bytes = (byte *) realloc(send_bytes,DATASIZE + HEADER);
memcpy (send_bytes, &messageHeader, HEADER);
memcpy (send_bytes + HEADER,buffer -> getText(), DATASIZE);
// Do something, suppose for now NOTHING
free (buffer -> getText());
buffer = NULL;
}
}
std::cout << "Finished sending" << std::endl;
}
int main() {
std::thread sending_thread(sending);
std::thread buffering_thread(start_buffering);
buffering_thread.join();
keep_sending = false;
sending_thread.join();
//free (buffer);
free (send_bytes);
return 0;
}
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <mutex>
#include <thread>
#define DATASIZE 10
#define HEADER sizeof(HeaderType)
class msg
{
private:
HeaderType header;
byte * text;
public:
msg(int ID);
HeaderType getHeader();
byte * getText();
};
msg::msg(int ID){
header.mID = ID;
text = (byte *)malloc (DATASIZE);
memset (text, '.', DATASIZE);
}
HeaderType msg::getHeader(){
return header;
}
void print(HeaderType header) {
std::cout << "Message ID: " << header.mID << std::endl;
}
byte * msg::getText(){
return text;
}
을하고이 HeaderType
다음과 같습니다 : 클래스 msg
이고 다음과 같이
typedef struct {
int mID;
}HeaderType;
,
Valgrind의 보고서 :
==3809== 20 bytes in 2 blocks are definitely lost in loss record 1 of 1
==3809== at 0x4028876: malloc (vg_replace_malloc.c:236)
==3809== by 0x80492BD: msg::msg(int) (in /home/linux/LCR-write/src/test)
==3809== by 0x8049384: start_buffering() (in /home/linux/LCR-write/src/test)
는 사실,이 코드 내부에 메모리 누수가 안 같아요. 버퍼는 항상 sending_thread
에 의해 비워야합니다. 누군가 제발 잘못을 지적 해 주시겠습니까?
고마워요 @alain. 여전히 같은 문제. 비록 이것이 잘못된 것이지만 내 문제는 아닙니다. 편집을 확인하십시오. – Moi
'~ msg()'에'free (text);'를 추가하고'msg * m = new msg (counter);'를 루프에 넣고'delete buffer;'를'sending() – alain
== 4287 == 1 블록의 18 (8 직접, 10 간접) 바이트가 4의 손실 레코드 4에서 확실하게 손실됩니다. == 4287 == 연산자 : 0x402842F : 연산자 (버퍼 -> getText() new (unsigned int) (vg_replace_malloc.c : 255) == 4287 == 0x8048D79 : start_buffering() – Moi