한 문자열을 다른 문자열에 추가하려고합니다. 두 개의 전역 문자열 변수 선언 -Valgrind가 string.append (문자열)에 불평합니다.
string grid_filename = "grids/";
string rest;
그런 다음 명령 줄 인수를 가져 오는 함수가 있습니다. 사용자가 명령 줄 인수에 파일 이름을 입력 할 때마다 나머지에 저장해야하며 나머지는 grid_filename에 추가되어야합니다.
==5602== Address 0x45fdc30 is 0 bytes after a block of size 32 alloc'd
==5602== at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==5602== by 0x43039F7: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304C77: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304DA6: std::string::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x43053E9: std::string::append(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x804D5AE: get_command_line_args(int, char**) (main.cpp:74)
==5602== by 0x804F138: main (main.cpp:244)
내가 문자열의 두 개의 주소를 출력하고 그 중 어느 것도 하나의 Valgrind의 0 바이트 말하고 일치 - 내 코드를 실행할 때마다
else if(strcmp(temp.substr(0,16).c_str(), "--grid-filename=") == 0) {
rest = temp.substr(16,strlen(temp.c_str())-16);
grid_filename.append(rest); //line 74!
}
지금, Valgrind의 날이 오류를 제공합니다. 내가 여기서 무엇을 놓치고 있니?
grid_filename을 TCP 연결을 통해 문자열을 보내는 다른 함수에 전달했기 때문에이 두 번째 오류가 발생한다고 생각합니다. Valgrind가 말해 줍니 다
==5660== Syscall param socketcall.send(msg) points to unaddressable byte(s)
==5660== at 0x404A9B1: send (socket.S:64)
==5660== by 0x804F7C8: main (main.cpp:364)
누구든지 내게 문제가 무엇인지 설명 할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다. 필요한 경우 코드에 대해 더 많이 제공 할 수 있습니다.
굿! ...... –
첫 번째 오류 메시지가 완료되지 않았습니다. 실제 오류 메시지는 붙여 넣은 텍스트 바로 위에 있어야하며, 0x45fdc30에 읽거나 쓰는 것에 관한 것이어야합니다. 그런 다음 valgrind는 붙여 넣은 메시지를 인쇄합니다.이 메시지는 해당 주소에 대해 알려줍니다. – wolfgang
내가 게시 한 두 번째 오류 메시지는 게시 한 첫 번째 바로 위에 발생합니다. 나는 그들이 분리되어 있다고 생각하여 따로 따로 썼다. 전체 메시지는 "Syscall param socketcall.send (msg)가 주소 지정 불가능한 바이트를 가리키고"다음에 "주소 0x45fdc30은 크기 32 alloc'd 메시지 블록 뒤에 0 바이트가옵니다."로 시작해야합니다. – Sterling