C++로 프로젝트를 시작했습니다. 이 언어로 된 메모리 관리는 저에게 새로운 것입니다.C++ 메모리 관리 기법/프랙티스
new()
으로 개체를 만든 다음 포인터를 전달하고 작동하는 동안 디버그하는 것이 어려워 사람들이 코드를 보았을 때 나를 재미있게 보았습니다. 나는 그것이 누설되거나 segfault (한 번 고정)되지 않았다는 사실을 아주 자랑스럽게 생각하지만 실제로 많은 노력이 필요했습니다.
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);
그래서이 프로젝트의 다음 버전에 대한 새로운 전략이 있습니다. 지금까지 내가하고있는 일은 new()
으로 개체를 만들고 고유 한 정수 ID 번호를 할당하는 것입니다. 그런 다음 ID를 키로 사용하여 해시 테이블에 개체를 저장합니다. 이제 항목은 정수 ID 번호로 저장되고 전달되며 해시 테이블로 이동하면 thing *
또는 NULL
중 하나가 반환됩니다. 따라서 더 이상 포인터 오류가 발생하지 않지만 코드 속도가 다소 저하됩니다.
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
}
}
지금 나는 종류의 친숙한 프로그래밍의 기본 신조로 생각하지만, 독학으로 아마추어 인 내가 업계 관행과 도구에 익숙하지 않다. 기본적으로 요구되는 것은 메모리 관리에 대한 지침입니다.
1) 내가 옳고 그른 일은 무엇인가?
2) 내가 사용할 수있는 패키지 나 라이브러리가 있습니까?
3) 업계의 표준 관행은 무엇입니까?
4) 기본적으로 염소 등을 검색하기 위해 무엇을 검색해야합니까?
오늘 나는 보통 파이썬을 사용하여 나를 위해 많은 "백엔드"자료를 처리하지만 C 또는 C++이 필요하다. (나는 평범한 C 플러스 stdC++ 라이브러리를 사용하고있는 것으로 추측된다. 언어 사이의 겹침은 - 속도와 성능면에서이 특정 프로젝트에 대해 g ++ 컴파일을 잘 알고 있음을 알고 있습니다. 일부 수학 천재가 알고리즘 픽스를 제공 할 수 있다고 의심하지만 결국 별도의 질문이긴하지만 속도를 높일 수는 없습니다.
'shared_ptr '을보고 시작하십시오. 내가 사용하는 거라고 –
첫 번째 도구는 Valgrind의이다 : http://valgrind.org/docs/manual/QuickStart.html – Anycorn
조회 RAII. 이것은 다소 미친 짓이다. 당신이 [좋은 C의 ++ 책]에서 혜택을 많이 거라고처럼 –