2016-10-20 2 views
-2

내 배열의 요소를 삭제하는 데 문제가 있습니다. 아래 코드 중 일부를 볼 수 있습니다.C++ 프로그램 문자 배열을 삭제할 때 종료 됨

두 번째 실행에서 delete[] payload[x].data 두 번째 루프에서 for 루프가 실행되면 프로그램이 종료됩니다.

struct s_payload{ 
     u_char data[300]; 
    } 
    . 
    . 
    u_char sample[300] ="Lorem ipsum dolor sit amet, eu mea laudem impetus."; 
    int _bufferSizeConnection = 1000; 
    int testCounter = 0; 
    s_payload* activeBuffer = new s_payload[_bufferSizeConnection]; 
    for (;;) { 
     for (long int counter = 0; counter < _bufferSizeConnection; counter++) {   
      memcpy(activeBuffer[counter].data, sample, 299); 
     } 
     //_buffersConnection is std::queue 
     _buffersConnection.push(activeBuffer); 
     testCounter += 1; 
     if (testCounter == 15) { 
      LOG_INFO(">testcounter %d", testCounter); 
      break; 
     }    
     activeBuffer = new s_payload[_bufferSizeConnection];      
    }   
    for (int i = 0; i < 15; i++) { 
     //taking one of the activeBuffer from _buffersConnection 
     s_payload* payload = _buffersConnection.wait_and_pop();   
     for (int x = 0; x < _bufferSizeConnection; x++) { 
      u_char* current= payload[x].data; 
      delete[] payload[x].data; //Exit at the second running of this line; 
     } 
     delete[] payload; 
    } 

이 코드 조각에는 어떤 문제가 있습니까? 미리 감사드립니다.

+5

새로 전화하지 않은 것을 삭제할 수 없습니다. 참조하십시오 : http://stackoverflow.com/questions/40134139/c-delete-a-pointer-free-memory – NathanOliver

+0

struct s_payload @ NathanOliver 고정 된 크기의 문자 배열을 선언했습니다. –

답변

3

당신은 activeBuffer = new s_payload[...]이라고 말 했으므로 합법적으로 delete[] activeBuffer라고 말할 수 있습니다. 그러나 data은 각 s_payload 요소 내의 포인터가 아닌 배열입니다. activeBuffer입니다. 따라서 delete payload[x] 또는 delete[] payload, data이 모두 사라질 때마다 delete payload[x].data —이 필요하지 않습니다.

그러나 내가 가지고있는 것을 패치하기보다는 접근 방식을 재고하는 것이 좋습니다. 고정 크기 버퍼 배열을 푸시하고 터벅 터벅 걷고 있습니다. — 정말 필요한가요? std::string 또는 std::vector<unsigned char>을 누를 뿐으로 메모리 관리에 대해 걱정할 필요가 없습니까? std::vector은 예를 들어 임의의 양의 데이터를 보유 할 수 있습니다.

라이브러리에서 가능한 한 많은 작업을 수행 할 필요가 없도록하십시오!