2015-01-27 1 views
0

다음 코드에서 New를 사용하여 Set를 만드는 데 사용 된 동적 메모리를 할당 해제하려고합니다. 내가 삭제하려고하면 SET의 노드.NEW/Delete Heap Corruption Detected : CRT가 힙 버퍼가 끝난 후 응용 프로그램이 메모리에 쓴 것을 감지했습니다.

#include <iostream> 
#include <set> 
#include <string> 

using namespace std; 

int main() 
{ 
    std::set<char *> myset; 
    std::set<char *>::iterator it; 
    char *l_ptr1, *l_ptr2; 

    std::cout <<"Before Insertion::Address of myset " << &myset<<endl; 
    //l_ptr1 = (char*)malloc(256*sizeof(char*));  
    //l_ptr2 = (char*)malloc(256*sizeof(char*)); 
    l_ptr1 = new char(256); 
    l_ptr2 = new char(256); 
    printf("Before Insertion ::Address of l_ptr1 %x\n", l_ptr1); 
    printf("Before Insertion ::Address of l_ptr2 %x\n", l_ptr2); 

    std::cin>>l_ptr1; 
    myset.insert(l_ptr1); 
    std::cin>>l_ptr2; 
    myset.insert(l_ptr2); 
    std::cout <<"After Insertion::Address of myset " << &myset<<endl; 

    std::cout << "Myset Contains :: Value and It's Address "<<endl; 
    it = myset.begin(); 
    std::cout<<*it<<"\t"<<&(*it)<<endl; ++it; 
    std::cout<<*it<<"\t"<<&(*it)<<endl; 
    std::cout << endl; 

    it = myset.begin(); 
    myset.erase(it++); 
    std::cout <<"After First Node Deletion ::Address of myset " << &myset<<endl; 
    std::cout <<"Before free(l_ptr1) :: l_ptr1:: " <<l_ptr1 <<endl; 
    //free(l_ptr1); 
    delete[] l_ptr1; 
    std::cout <<"After free(l_ptr1) :: l_ptr1:: " <<l_ptr1 <<endl; 
    myset.erase(it); 
    std::cout <<"After Second Node Deletion ::Address of myset " << &myset<<endl; 
    std::cout <<"Before free(l_ptr2) :: l_ptr2:: " <<l_ptr2 <<endl; 
    //free(l_ptr2); 
    delete[] l_ptr2; 
    std::cout <<"After free(l_ptr2) :: l_ptr2:: " <<l_ptr2 <<endl; 

    printf("After All Node Deletion ::Address of l_ptr1 %x\n", l_ptr1); 
    printf("After All Node Deletion ::Address of l_ptr2 %x\n", l_ptr2); 

    return 0; 
} 

다음 오류가 발생합니다.

힙 손상 감지 : 0x005B5380의 일반 블록 (# 150) 이후. CRT 응용 프로그램이 힙 버퍼 종료 후 메모리에 쓴 것으로 감지되었습니다.

+4

'new char (256);'->'새로운 char [256];','printf' 형식도 고쳐야합니다. ** **에서 컴파일러 경고를 켭니다. – user657267

답변

-1

당신은

delete l_ptr1; 
delete l_ptr2; 

되지는 new하지 new []를 사용하여 할당대로 [] 삭제

에 대해 다음 사용해야합니다.

new char(256)

char를 할당하고 할당에 따라서는 256

또는

난 당신이 할당 된 문자 배열하고 싶은 생각됩니다

l_ptr1 = new char[256]; 
l_ptr2 = new char[256]; 

사용 new [] 연산자를 초기화합니다.

+1

나는 이것을 upvote 할 수 없다.실제로 사실이지만 올바르지 않은 충고로 시작하고 잘못된 조언을 한 다음 잘못 입력하면 '삭제'가 아니라 '변경'이 필요한 '새'라는 것을 깨달았을 때 절반 만 수정합니다. . –

+0

이것은 완전히 끔찍하고 거룩한 쓰레기입니다. 누군가에게'새로운 []'을 추천하지 마십시오. – Puppy

+0

@Puppy : 수정 사항을 게시하십시오. – doptimusprime

9

먼저 제가로부터 많은 것을 배웠 프로그래머를 인용하자 :

귀하의 C++ 코드는 버그를 포함 : 당신이 표준 : : 문자열을 사용하고 있지 않습니다.

l_ptr1 = new char(256); 

이 줄은 하나의 문자를 할당됩니다 : 당신 어렵게 생활을하고 문자 배열을 사용하여를 주장하는 경우

, 당신은 당신의 코드가 실제로 당신이 원하는 것을 여부를 확인해야했다 그
이 라인 (256 개)의 문자를 할당하는 번호 256

l_ptr1 = new char[256]; 

할당.

3
new char(256) 

은 255 문자 (char 유형으로 변환 한 후)와 함께 단일 문자를 할당합니다. 배열로 취급하므로 배열을 할당합니다.

new char[256] 

배열을 할당합니다.

입력이 임의의 256보다 길면 프로그램이 폭발합니다. 원시 메모리를 직접 저글링하지 말고 std::string을 사용하여 문자열을 나타내는 것이 좋습니다.

관련 문제