나는 C++을 배우고 있으며 새로운 문제에 대해 다시 한 번 비틀 거렸다.C++ 새로운 C 배열 할당, RAII 또는 간단한 shared_ptr/boost :: shared_array
라이브러리를 사용할 수 있도록 C 배열을 할당해야하지만, 안전한 방법으로 사용해야합니다. 나는 이미 그 삭제 [] 발견; 방법의 끝에서 비참하게 실패합니다. 좋은하지
OLD :
float *buf;
try {
buf = new float[daswidth*chans_info.chans*sizeof(float)];
}
catch (std::bad_alloc& ba) // sometimes it throws ! so i do need to stop my execution.
{
if (DEBUG) tekstasFormat(L"WARNING: bad alloc caught: %s", ba.what());
return; // skip this iteration then.
}
//... OUR CODE
delete[] buf;
내가 예전 할당 및 삭제하는 대신 완벽하게 작동하는 사용하는 tryed 그래서 :
float *buf;
std::shared_ptr<float> safe_buf(new float[daswidth*chans_info.chans*sizeof(float)], [](float *p) { delete[] p; });
// OR BOOST EQUIVALENT
boost::shared_array<float> safe_buf(new float[daswidth*chans_info.chans*sizeof(float)]);
buf = safe_buf.get();
우리가 누설하지 않는, 모두가 행복하다 . 그러나 new_alloc을 잡는 법은 지금 던졌습니다.
새 {} 범위에서 shared_ptr을 할당 할 예정이라면 ... 파괴 된 이후에 나에게 ... 나 같은 미래에 대해 나에게 설명해주십시오. 이 경우 예외 처리 방법은 무엇입니까?
'std :: vector'를 사용할 수없는 이유가 있습니까? –
'std :: vector'는 실제로 그것을 초기화 할 때 생성되는'T *'를 포함합니다. 수표와 함수를 사용할 때 호출되는 오버 헤드는 약간 있지만 오버 헤드는 확실히 있습니다. –
'sizeof (float)'는 여기에서 의심스러워 보입니다. 당신의 유스 케이스가 무엇인지 모르겠지만,'new float [n * sizeof (float)]'는'n * sizeof (float)'가 아닌'n * sizeof (float)'float를 할당합니다. 너도 알다시피. – milleniumbug