나는 항상 std::string
또는 메모리를 할당하는 다른 클래스를 던져서는 안된다는 것을 읽습니다. here 또는 더 중요한 것은 포인트 3에 here입니다. - std::string
개체을 포함시키지 마십시오.(not) 예외에서 std :: string 사용
이제는 내 프로젝트에 boost::exception을 삽입하려고하고 있는데 무엇이 표시됩니까 : lots of strings.
부스트를 권장하지 않는 이유는 무엇입니까?
그리고 config-file에서와 같이 하드 코드 할 수없는 매개 변수가있는 경우 std::string
을 사용하지 않고 예외에 넣을 수있는 방법은 무엇입니까?
또는 가이드 라인 만 이 가능 지침대로 거의 std::string
를 사용하지 않는 std::string
를 사용하지 않는입니까? 나는 조금 혼란 스럽다 ...
나는 약간 연구를했다. 내가 틀렸다면 나를 바로 잡으세요. 내가 제대로 이해하면
, 그것은 던져 동안 할당 에 대해 전부 및 할당 된 메모리에 무슨 일이 일어나고 있는지. 따라서 메모리를 생성자에 할당하면 메모리가 손실되고 예외의 소멸자에서 해제 할 수 없으므로 메모리 누수가 발생합니다. 던지기 전에 이것을 할당하는 것은 괜찮습니다. 따라서 예외는 깨끗합니다. 이 결과는
struct xexception {
int *ttt[10];
xexception() {
ttt[0] = new int[0xfffffffL];
ttt[1] = new int[0xfffffffL];
ttt[2] = new int[0xfffffffL];
ttt[3] = new int[0xfffffffL];
ttt[4] = new int[0xfffffffL];
ttt[5] = new int[0xfffffffL];
ttt[6] = new int[0xfffffffL];
ttt[7] = new int[0xfffffffL];
ttt[8] = new int[0xfffffffL];
ttt[9] = new int[0xfffffffL];
}
~xexception() throw() {
//never happen
delete[] ttt[0];
delete[] ttt[1];
delete[] ttt[2];
delete[] ttt[3];
delete[] ttt[4];
delete[] ttt[5];
delete[] ttt[6];
delete[] ttt[7];
delete[] ttt[8];
delete[] ttt[9];
}
};
int main(int argc, const char *argv[]) {
try {
throw(xexception());
}
catch (const xexception &e) {
std::cerr << "\nttt " << e.ttt[0][0] << std::endl;
}
catch (std::bad_alloc) {
std::cerr << "bad alloc" << std::endl;
}
return 0;
}
, 나는 bad_alloc 뿐이다 거대한 메모리 누수를 얻을 :
나는이 시도.이전에 할당을 수행하면 도 예외가 생성되기 전에 bad_alloc을 발생시킵니다.
예외 개념 내 예외입니다 : 관심
? 내 프로그램에 bad_alloc이 있다면, memory_leak 나 다른 것 때문에 (나는 마이크로 컨트롤러가 아닌 PC의 프로그램에 대해 이야기하고있다.) 다른 문제가있다. 어쩌면 bad_alloc이 발생했는지 알 수 있습니다. 그러나 어디에서? 함수 중 하나 (어쩌면 1000) 또는 std::string
(내가 문자열이라는 것을 알지만 ... 문자열의 메모리를 조작 할 가능성이 없다 ... 또는 그 소멸되는) 동안의 alloc에서.
try {
// where is the error???
int *x = new int[100]; // here?
....
int *y = new int[100]; // or here?
....
int *z = new int[100];
....
int *w = new int[100];
....
int *t = new int[100];
....
int *f = new int[100];
....
std::string str("asdfasdfasdfasdfasdfasdfasdf"); // maybe here
}
catch (the error) {
....
}
그리고? 어디에서 일어나는지 알아 내려고할까요? 따라서 나는 예외가 아닌 valgrind을 사용할 것입니다.
void foo() {
int *i = new int[1];
foo();
}
try {
foo();
}
chatch(bad_boy) {
go_exception_handler_go(parameters); // oh, shit happens: also an stack_overflow may happend, cause stack is also full
}
아니면 errormessage를 조작하고 로그하여 다음 bad_alloc을 던질 것입니다.
저를 오해하지 마십시오.나는 boost :: exception을 보았으므로 (예외를 기다릴 때까지) 예외 클래스를 다시 작성했지만, 모든 모래알을 집어들 필요가 없다고 생각한다.
'exception'의 * members * 인 std :: string은 보이지 않습니다. –
'std :: runtime_error'는'std :: string'을 사용합니다. –
문자열을 매개 변수로 사용하는 것이 좋습니다. – user1810087