...
In this non-compliant code example, the resources associated with the object pointed to by pst
are not recovered in the event that processItem
throws an exception, thereby potentially causing a resource leak.
Code Block | ||
---|---|---|
| ||
while (moreToDo) {
SomeType *pst = new SomeType();
try {
pst->processItem();
}
catch (...) {
// deal with exception
throw;
}
delete pst;
}
|
...
In this code, the exception handler recovers the resources associated with the object pointed to by pst
.
Code Block | ||
---|---|---|
| ||
while (moreToDo) {
SomeType *pst = new SomeType();
try {
pst->processItem();
}
catch (...) {
// deal with exception
delete pst;
throw;
}
delete pst;
}
|
...
A better approach would be to employ RAII. This forces every object to 'clean up after itself' in the face of abnormal behavior, preventing the programmer from having to do so. A judicious unique_ptr
would free the resource whether an error occurs or not.
Code Block | ||
---|---|---|
| ||
while (moreToDo) {
std::unique_ptr<SomeType> pst = new SomeType();
try {
pst->processItem();
}
catch (...) {
// deal with exception
throw; // pst automatically freed
}
// pst automatically freed
}
|
...
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
RES38 MEM44-C CPP | 1 (low) | 2 (probable) | 1 (high) | P2 | L3 |
...