2008-10-15 5 views
3

void 포인터의 배열을 선언하고 있습니다. 각각은 임의의 유형의 값을 가리 킵니다. 다음과 같이
void **values; // Array of void pointers to each value of arbitary typevoid 포인터의 배열에 할당 된 메모리를 해제합니다.

값을 초기화 :


    values = (void**)calloc(3,sizeof(void*)); 
    //can initialize values as: values = new void* [3]; 
    int ival = 1; 
    float fval = 2.0; 
    char* str = "word"; 
    values[0] = (void*)new int(ival); 
    values[1] = (void*)new float(fval); 
    values[2] = (void*)str; 

    //Trying to Clear the memory allocated 
    free(*values); 
    //Error: *** glibc detected *** simpleSQL: free(): invalid pointer: 0x080611b4 
    //Core dumped 
    delete[] values*; 
    //warning: deleting 'void*' is undefined 
    //Similar Error. 

을 이제 어떻게 무료로 할/값에 할당 된 메모리 (무효 포인터의 배열)을 삭제 하시겠습니까?

+0

아마도 : 값 = (void **) calloc (3, sizeof (void *)); – botismarius

답변

6

동적으로 2 개 가지 방법으로 해제 할 그 필요성을 할당 3 가지가 있습니다.

노트의 몇 :

  • 나는 sizeof(void) 이 당신은 내가 약 아무 말도하지 않을거야
  • 를 컴파일되지 않습니다 무슨 이후 sizeof(void*) 될 예정이었다 있으리라 믿고있어 제외한 겉으로는 무작위로 주조는 코드처럼 보이는 것을 그 일반적으로 재해 준비
+0

"재앙"부분에 마이크와 동의해야합니다. OP : C 또는 C++로 프로그램을 작성하려고합니까? C에서는 void *로 캐스트하는 것이 의미가 있지만 종종 자신이하는 일을 알아야합니다. C++에는 당신이하고있는 것처럼 보이는 다른 관용구가 있습니다. 프로그래밍하려는 언어를 결정하십시오. –

+0

C++에서 다른 데이터 유형의 데이터를 보유한 컨테이너를 작성하는 방법을 알지 못합니다. 벡터를 사용해 보았지만 같은 유형의 데이터 만 가질 수 있습니다. 누구든지 위와 같은 다른 방법을 제안 할 수 있습니까? – user27221

+0

이기종 유형의 컨테이너를 작성하는 다양한 방법이 있습니다. C++에서이 작업을 수행하는 몇 가지 방법에 대해서는 FAQ를 참조하십시오. http://www.parashift.com/c++-faq-lite/containers.html#faq-34.4 –

0

void *가 원래 calloc 된 횟수를 추적하고 각 호출을 자유롭게 한 다음 원래 값 변수를 해제해야합니다.

... 미리보기가 정상적으로 작동합니다.

int ct = 3; 
values = (void*)calloc(ct,sizeof(void)); 
//can initialize values as: values = new void* [3]; 
int ival = 1; 
float fval = 2.0; 
char* str = "word"; 
values[0] = (void*)new int(ival); 
values[1] = (void*)new float(fval); 
values[2] = (void*)str; 

for (int i = 0; i < ct; i++) [ 
    delete(values[i]); 
} 
free(values); 
+0

쓰레기 ... 제발 누군가 코드 블록처럼 포맷하는 법을 말해줘. – billjamesdev

+0

각 줄 앞에 공백 4 개를 넣으십시오 – fizzer

+0

그리고 pre 태그를 사용하지 마십시오. –

0

C에서 작업 할 때 왜 새로운 태그를 사용하는지 확신 할 수 없습니다 (여기에서 태그 참조).

필자는 필자가 원하는 배열의 개별 부분을 malloc 한 다음 자유롭게 만들 것입니다. 처음에는 malloc하지 않은 것을 해제 할 수 없습니다. void 포인터는 삭제할 수 없습니다. values = (void*)calloc(3,sizeof(void)) :

7

나는 문제가 당신이 values 할당 방식에 의심. 단지 sizeof(void)이 아닌 sizeof(void *)이어야합니다.

sizeof (void)가 0이거나 다른 의미가있을 수 있으므로 실제로 할당 할 메모리를 할당하지 않은 것입니다. 할당 작업이 작동하는 것은 어리석은 일입니다. 그러면 오류가 발생합니다. 당신은 메모리를 할당 해제하려고합니다.

편집 : - C 스타일 malloc/free과 스타일 new/delete 또한 ++ C 사이의 교류에 의해 문제를 요구하고 있습니다. delete 당신이 뭔가를 malloc '또는 free 뭔가 당신이 new'에드,하지만 당신이 이렇게 갈 경우 당신의 머리에 그들을 섞어 갈거야 두 가지 모두를 사용하는 것이 좋습니다. str가 동적으로 할당되지 않기 때문에이 (실제로 하지 수) 해제되어서는 안된다는

delete reinterpret_cast<int*>(values[0]);  
delete reinterpret_cast<float*>(values[1]); 

free(values); // I'm not sure why this would have failed in your example, 
       // but it would have leaked the 2 items that you allocated 
       // with new 

참고 :

+0

무효 * 대 공허에 좋은 잡기. 나는 그것을 알아 차리지 못했다. – Jon

+0

고마워요! sizeof (void)는 정말로 내 머리 속에서 경고음을 울리도록 설정했습니다. –

1

새로운 * alloc()을 혼합하고 있습니다. 이는 '아니오'이며, 정의되지 않은 결과를 초래할 수 있습니다.

+0

조심하지 않으면 (아주 ​​조심스럽게). 여기서 malloc/delete를 혼합하는 것이 문제입니다. –

0

메모리 누수 값인 [0]과 값 [1]도 삭제하지 않는다는 점에 유의하십시오. 그러나 디자인에 따르면 값 .2 데이터 섹션에 대한 포인터 이후 값 [2]을 비울 수 없습니다.

4

이것은 boost :: any class의 완벽한 상황입니다.
또한 자신의 메모리를 할당하는 대신 벡터를 사용하는 것이 좋습니다. 원래 코드에 다시 주요 문제를가는

std::vector<boost::any> data; 
boost::any i1 = 1; // add integer 
data.push_back(i1); 

boost::any f1 = 1.0; // add double 
data.push_back(f1); 

data.push_back("PLOP"); // add a char * 

std:: cout << boost::any_cast<int>(data[0]) + boost::any_cast<double>(data[1]) 
      << std::endl; 

이었다

또한
values = (void*)calloc(3,sizeof(void)); 

// This should have been 
void** values = (void**)calloc(3,sizeof(void*)); 

// Freeing the members needs care as you need to cast them 
// back to the correct type before you release the memory. 

// now you can free the array with 
free(values); 

주의 : 모두 새를 사용하는 것은 불법은 아니지만/삭제하고 동일한 코드 조각은 calloc/무료 그것을 눈살을 찌푸리게된다. 주로 일이 섞이고 그것이 치명적일 수 있기 때문에 주로.

+0

이제 끝내겠습니다. 나는 Boost에 관해서 많은 좋은 것들을 보았고, C++을 다시 사용하도록 설득 할 수도 있습니다. –

관련 문제