Tôi đã bắt đầu một dự án trong C++. Quản lý bộ nhớ bằng ngôn ngữ này là mới đối với tôi.Kỹ thuật quản lý bộ nhớ C++/Thực tiễn
Tôi đã sử dụng để tạo đối tượng với new()
và sau đó vượt qua xung quanh con trỏ và trong khi nó hoạt động, đó là một nỗi đau để gỡ lỗi và mọi người nhìn tôi buồn cười khi họ nhìn thấy mã. Tôi khá tự hào về thực tế rằng nó không bị rò rỉ hoặc segfault (một lần cố định), nhưng nó thực sự là rất nhiều nỗ lực.
list <struct Connection *> users;
struct Connection * accept_connection (const char *name) {
struct Connection * new_node = new Connection();
new_node->_data = ... // whatever, set it up here
return new_node;
}
struct Connection * new_user = accept_connection (const char *name);
users.append (new_user);
Vì vậy, tôi có một chiến lược mới cho phiên bản tiếp theo của dự án. Cho đến nay những gì tôi đang làm là tạo ra các đối tượng với new()
và gán cho chúng một số ID nguyên duy nhất. Sau đó, tôi lưu trữ đối tượng trong bảng băm bằng cách sử dụng ID làm khóa. Bây giờ các mục được lưu trữ và truyền xung quanh bởi số ID nguyên và khi bạn cần phải de-tham chiếu nó, bạn đi đến bảng băm và nó trả về cho bạn hoặc thing *
hoặc NULL
. Do đó tôi không còn gặp lỗi con trỏ nhưng tốc độ của mã được giảm một chút.
typedef unsigned long ID_Number;
// create a user and return the ID
ID_Number create_user() {
ID_Number new_id = assign_unique_id();
struct User * node = new User();
node->_id = new_id;
node->_data = ... // whatever, set it up here
add_to_users_dict (new_id, node);
return new_id;
}
list <ID_Number> users;
for_each (users.begin(), users.end(), process_user);
void process_user (ID_Number i) {
struct User * u_ptr = lookup_user_dict (i);
if (u_ptr == NULL) {
// not found in dict
// somehow this guy was deleted
} else {
// we can do stuff with this guy
}
}
Bây giờ tôi đã quen thuộc với nguyên lý cơ bản của lập trình nhưng là một người có sở thích tự học, tôi không quen thuộc với các thực tiễn và công cụ của ngành. Những gì tôi về cơ bản yêu cầu, là hướng dẫn về quản lý bộ nhớ:
1) Tôi đang làm gì đúng hay sai?
2) Có bất kỳ gói hoặc thư viện nào tôi có thể sử dụng sẽ giúp tôi không?
3) Thực tiễn tiêu chuẩn của ngành là gì?
4) Về cơ bản tôi nên googling hoặc mua cho kindle vv?
Hôm nay tôi thường sử dụng Python, nó xử lý nhiều thứ "back end" cho tôi, nhưng tôi cần C hoặc C++ (tôi đoán mình đang sử dụng đồng bằng C cộng với stdC++ libs, tôi không chắc lắm Sự trùng lặp giữa các ngôn ngữ là - tôi chỉ biết g ++ biên dịch tốt) cho một dự án cụ thể vì lý do tốc độ/hiệu suất: mặc dù tôi nghi ngờ một số thiên tài toán học có thể cung cấp các bản sửa lỗi thuật toán để tăng tốc, mặc dù đó là một câu hỏi riêng.
Bắt đầu bằng cách xem 'shared_ptr'. –
Công cụ đầu tiên tôi sử dụng là valgrind: http://valgrind.org/docs/manual/QuickStart.html – Anycorn
Tra cứu RAII. Điều này thật điên rồ. –