2014-03-06 1 views
3
 enum Direction { 
    NORTH = 0, 
    EAST = 1, 
    SOUTH = 2, 
    WEST = 3 }; 

    struct Point { 
    int x, y; }; 

    class Path { 
     private: 
     Point visited[10000]; 
     int visited_positions; 
     bool circular; 

     public: 
      Path() { 
      visited_positions = 1; 
      circular = 0; 
      Point p; 
      p.x = 0; 
      p.y = 0; 
      visited[0] = p; 
     } 

     void add_point(Point p) { 
      if(!circular) { 
       for(int i = 0; i < visited_positions; i++) { 
        if(visited[i].x == p.x && visited[i].y == p.y) { 
         circular = true; 
         break; 
        } 
       } 
      } 
      visited[visited_positions] = p; 
      visited_positions++; 
     } 

     bool is_circular() { 
      return circular; 
     } 

}; 

class Robot { 
    private: 
     Point position; 
     Direction direction; 
     Path path; 

    public: 
     Robot() { 
      position.x = 0; 
      position.y = 0; 
      direction = NORTH; 
     } 

     void turn_left() { 
      direction = static_cast<Direction>((direction + 3) % 4); 
     } 

     void turn_right() { 
      direction = static_cast<Direction>((direction + 1) % 4); 
     } 

     void forward() { 
      switch (direction) { 
       case NORTH: 
        position.y++; 
        break; 
       case EAST: 
        position.x++; 
        break; 
       case SOUTH: 
        position.y--; 
        break; 
       case WEST: 
        position.x--; 
        break; 
      } 
      path.add_point(position); 
     } 

     Point get_position() { 
      return position; 
     } 

     bool has_gone_in_a_loop() { 
      return path.is_circular(); 
     } }; 

int main() { 

    int test_cases; 
    cin >> test_cases; 

    string instruction_string; 

    for(int tc = 0; tc != test_cases; tc++) { 
     cin >> instruction_string; 
     Robot skundi; 

     for(size_t i = 0; i < instruction_string.size(); i++) { 
      switch(instruction_string[i]) { 
       case 'H': 
        skundi.turn_right(); 
        break; 
       case 'V': 
        skundi.turn_left(); 
        break; 
       case 'F': 
        skundi.forward(); 
        break; 
      } 
     } 
     if(skundi.has_gone_in_a_loop()) { 
      cout << "Circular" << endl; 
     } 
     else { 
      cout << "OK" << endl; 
     } 
    } 
    return 0; } 

이것은 숙제 임으로 어떤 힌트에도 감사드립니다. (아무런 경품도 : D) 이것들은 내가 겪고있는 valgrind 오류입니다. 당신이 ("아마도 손실"로 나타납니다 그 이유는) 하나로 볼 수 있지만C++ 로봇, 숙제 과제 - 메모리 누수로 인한 valgrind 오류가 발생합니다. 일부 힌트가 정말 필요합니다

Memcheck, a memory error detector 
Invalid read of size 8 
Using Valgrind: 

**HEAP SUMMARY:** 
in use at exit: 16,352 bytes in 1 blocks 
total heap usage: 14 allocs, 13 frees, 28,907 bytes allocated 
16,352 bytes in 1 blocks are possibly lost in loss record 1 of 1 

at 0xX: operator new(unsigned long) (vg_replace_malloc.c:298....) 
by 0xX: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator const&) (in /usr/lib64/libstdc++.so.6.0.13) 
by 0xX: std::string::_Rep::_M_clone(std::allocator const&, unsigned long) (in /usr/lib64/libstdc++.so.6.0.13) 

by 0xX: std::string::reserve(unsigned long) (in /usr/lib64/libstdc++) 
by 0xX: std::basic_istream >& std::operator>>, std::allocator >(std::basic_istream >&, std::basic_string, std::allocator >&) (in /usr/lib64/libstdc++) 

**LEAK SUMMARY:** 
definitely lost: 0 bytes in 0 blocks 
indirectly lost: 0 bytes in 0 blocks 
possibly lost: 16,355 bytes in 1 blocks 
still reachable: 0 bytes in 0 blocks 
suppressed: 0 bytes in 0 blocks 
For counts of detected and suppressed errors, rerun with: -v 
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6) 
+3

오류를 올바르게 해석하면 valgrind는 memleak을'cin >> instruction_string;'으로 가정합니다. 그러나 이것은 memleak이 아닙니다. 또한 valgrind는 이것을 '가능한 손실'이라고 선언합니다. 'new'로 직접 일하지 않으면 memleaks를 결코 두려워해서는 안됩니다. 코드에는 자동 저장 변수 만 포함됩니다. – Paranaix

답변

1

이 엄격 메모리 누수되지 않습니다.

가 여기에 문제를 복제하는 최소한의 시나리오입니다 : (당신은 여전히 ​​포인터를 가리키는 때문에)

static int *global_data = nullptr; 
int main(int, char**) 
{ 
    global_data = new int{9}; // allocated for the duration of the application 
           // we rely on the program exitting for deallocation 
} 

이 경우, 메모리가 손실되지 않습니다. 또한 결코 할당이 해제되지 않으므로 데이터가 유출되었는지 여부는 논쟁의 여지가 있습니다 (그리고 여러 포럼에서 반복적으로 토론 된 내용).

valgrind가이 부분에 중점을두고 "손실되었을 가능성이 있습니다"라고 말합니다 (사용자가하려는 일에 따라 누출인지 여부는 사용자에게 달려 있습니다).

구체적인 예로, stl 구현의 내부 데이터가 "손실 될 수 있음"입니다. 걱정할 것이 없습니다.

+2

그의 코드에서 그러한 상황이 나타나는 곳은 어디입니까? – Paranaix

+1

"stl 구현"에서 메모리가 누출되었다고 걱정됩니다. 예를 들어 코드를 동일한 프로세스 내에서 지속적으로로드 및 언로드되는 공유 객체로 변경하면 누수가 누적됩니다. –