2011-08-20 2 views
0

이 오류가 계속 발생하지만 변수에 대한 동적 메모리 (upSizedPlaintext, upsizedKey, upsizedCiphertext 또는 upsizedKeyD)를 언제 삭제할 수 있는지 알 수 없습니까?힙 손상 감지, 동적 메모리를 어디에서 삭제할 수 있습니까?

과제를 수행하기 때문에 BOOST 테스트를 사용해야하고 강사가 사용할 테스트에서 encryptedText가 삭제되고 BOOST 테스트에서 해독됩니다. 하지만 위에서 변수를 삭제할 수있는 곳을 찾을 수는 없습니다. 모든 아이디어와 도움이 크게 감사하니?

또한 C++ 문자열이 아닌 C 스타일 문자열을 사용해야합니다.

답변

1

다양한 장소에서

char * decrypted = new char[lengthOfCiphertext + 1]; 

같은 문제가 있어야한다 나

char * decrypted = new char[lengthOfCiphertext]; 

에 같은 문제처럼 보인다. 힙 손상은 잘못된 시간에 삭제 중이기 때문에가 아니라 할당 된 메모리 범위를 벗어나 쓰고 있기 때문입니다. 이 경우에는 너무 적은 바이트를 할당하기 때문입니다.

+0

그건 원래 생각했는데 ... 원래는 그게 좋았지 만, 좀 더 생각하고 효과가 있다고 생각하지 않았습니다. 수정 한 후에 언급 된 변수를 어디에서 삭제할 수 있습니까? – Brandon

+0

거기에 단 하나의 대답이 있습니다. 더 이상 메모리를 사용할 필요가 없을 때. 귀하의 경우에는'암호화 '에서 바로 그렇게하는 것처럼 보입니다.이 함수를 떠날 때 더 이상'upsizedPlainText'와'upsizedKey'가 가리키는 메모리를 사용할 수 없으므로 삭제하는 것이 옳습니다. 그러나'decrypt'에서는 메모리를 할당하지만 절대 삭제하지 않습니다. 따라서 메모리 누수가 발생합니다. 일반적으로 언제 메모리를 삭제해도 안전한지 추적하는 것은 매우 어려운 일입니다. 당신이해야하는 방식으로 힙 할당을 사용하지 않는 또 다른 이유. – john

+0

아, 네,'암호 해독 '후 삭제하는 것을 잊었지만 지금 추가하고 수정 해 드리겠습니다. – Brandon

0

표시되는 모든 위치에서 변수를 삭제할 수 있습니다. 함수 내부의 지역 변수이기 때문에 해당 함수 내부의 아무 곳이나 해당 변수를 포인터로 전달하는 함수에서 삭제할 수 있습니다.

해당 포인터가 가리키는 메모리를 삭제할 수있는 위치와 큰 차이가 있습니다. 에서 해당 변수를 삭제해야합니다. 당신이 그들을 삭제해서는 안되는 장소가 많이 있습니다. 변수가 전달되는 함수에서 변수를 삭제하는 것은 일반적으로 좋지 않습니다. 함수를 사용하기 전에 함수를 삭제하는 것은 매우 나쁜 생각입니다.

마지막 사용과 생성 한 함수에서 반환 사이의 어느 곳에서나 삭제해야합니다. 그것들을 지우지 않으면 메모리 누수가 발생하고 너무 일찍 삭제하면 정의되지 않은 동작이 발생합니다.

2

암호화 및 암호 해독에서 새 메모리에 대한 포인터를 반환하면 해당 함수를 호출하는 코드가 수신 포인터에 delete[]을 호출해야합니다.

아주 좋은 인터페이스가 아니며 C++ 코드에서 std :: string을 사용하는 이유 중 하나입니다!

C 코드의 일반적인 힙 손상 원인은 문자열의 널 종결자를 잊어 버리고 strlen(s) + 1 바이트 대신 strlen(s) 바이트를 할당하는 것입니다. 나는 네가 여러 곳에서 그렇게한다고 믿는다.

+2

문자열을 처리하지 않을 때 다른 STL 컨테이너와 스마트 포인터가 추가되었습니다. –

관련 문제