2011-09-22 36 views
6

Valgrind đang phàn nàn với lời gọi nền.Lý do cho lỗi Valgrind này là gì?

string Message::nextField(string& input) { 
    int posSeparator = input.find_first_of(SEPARATOR); 
    string temp; 
    temp = input.substr(0, posSeparator); //Error points to this line 
    input.erase(0, posSeparator + 1); 
    return temp; 
} 

Các lỗi đi:
290 byte trong 12 khối chắc chắn bị mất trong lỗ kỷ lục 1 của 1
gì chức năng thực hiện được về cơ bản phân tích đầu vào, trở về các phần của chuỗi phân cách bằng vật SEPARATOR. Hàm này được gọi từ phương thức của lớp khác với định nghĩa tiếp theo:

void doSomething(string input) { 
    input.erase(0,2); 
    string temp = nextField(input); 
    this->room = atoi(temp.c_str()); 
    temp = input; 
    this->money = atoi(temp.c_str()); 
} 

Không có gì khác lạ hoặc đủ quan trọng để được đưa vào đây. Tôi sử dụng thiết lập mặc định cho Valgrind từ lược tả Valgrind của Eclipse Indigo. Bất kỳ ý tưởng nào?

+3

Bạn có tối ưu hóa trong khi biên dịch không? Nếu có thì đừng. Điều này gây ra rất nhiều báo cáo giả mạo từ valgrind. –

+0

Bạn có thể viết 'string temp = input.substr (0, posSeparator);' để khởi tạo chuỗi thay vì gán cho nó. Nó không phải là rõ ràng đó là bất cứ điều gì để làm với vấn đề của bạn, mặc dù. –

+0

@DavidHammen Không, tôi không có. – Erandros

Trả lời

0

Bạn không kiểm tra xem posSeparator có thực sự khác với chuỗi :: npos - điều này có thể gây ra sự cố khi xóa. Đó là một cảnh hoang dã, nhưng nó có thể sửa chữa một lỗi anyway.

1

Có thể bạn có lỗi ở một nơi khác trong nguồn của mình. Tôi cố gắng để nhân rộng các lỗi sử dụng đoạn mã sau:

#include <string> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

const char SEPARATOR = ':'; 

struct Foo 
{ 
public: 
    int room; 
    int money; 

    void doSomething(string input) { 
     input.erase(0,2); 
     string temp = nextField(input); 
     this->room = atoi(temp.c_str()); 
     temp = input; 
     this->money = atoi(temp.c_str()); 
    } 

    string nextField(string& input) { 
     int posSeparator = input.find_first_of(SEPARATOR); 
     string temp; 
     temp = input.substr(0, posSeparator); //Error points to this line 
     input.erase(0, posSeparator + 1); 
     return temp; 
    } 
}; 

int main() 
{ 
    Foo f; 
    f.doSomething("--234:12"); 
    std::cout << f.room << " - " << f.money << std::endl; 
} 

Sau đó, một ran valgrind:

valgrind --tool=memcheck <executable> 

và đầu ra là:

HEAP SUMMARY: 
    in use at exit: 0 bytes in 0 blocks 
    total heap usage: 2 allocs, 2 frees, 61 bytes allocated 

All heap blocks were freed -- no leaks are possible 

For counts of detected and suppressed errors, rerun with: -v 
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

Vì vậy, có lẽ vấn đề của bạn không có trong phần này của mã

2

Đây có thể không phải là lỗi trong mã của bạn. Lỗi này có thể được báo cáo do chi tiết về việc triển khai thư viện chuẩn C++. Để xác minh điều này hãy thử như sau từ Valgrind FAQ:

Với GCC 2,91, 2,95, 3,0 và 3,1, biên dịch tất cả các nguồn sử dụng STL với -D__USE_MALLOC. Cẩn thận! Điều này đã bị xóa khỏi GCC bắt đầu bằng phiên bản 3.3.

Với GCC 3.2.2 trở lên, bạn nên xuất biến môi trường GLIBCPP_FORCE_NEW trước khi chạy chương trình của bạn.

Với GCC 3.4 trở lên, biến đó đã đổi tên thành GLIBCXX_FORCE_NEW.

Các vấn đề liên quan