Tôi đã viết trình gỡ lỗi heap sau đây để chứng minh rò rỉ bộ nhớ, xóa kép và sai hình thức xóa (tức là cố xóa một mảng với delete p
thay vì delete[]
p) để bắt đầu lập trình viên.Phê bình trình gỡ lỗi heap của tôi
Tôi rất muốn nhận được một số phản hồi về điều đó từ các lập trình viên mạnh mẽ của C++ bởi vì tôi chưa bao giờ làm điều này trước đây và tôi chắc chắn rằng tôi đã thực hiện một số sai lầm ngu ngốc. Cảm ơn!
#include <cstdlib>
#include <iostream>
#include <new>
namespace
{
const int ALIGNMENT = 16;
const char* const ERR = "*** ERROR: ";
int counter = 0;
struct heap_debugger
{
heap_debugger()
{
std::cerr << "*** heap debugger started\n";
}
~heap_debugger()
{
std::cerr << "*** heap debugger shutting down\n";
if (counter > 0)
{
std::cerr << ERR << "failed to release memory " << counter << " times\n";
}
else if (counter < 0)
{
std::cerr << ERR << (-counter) << " double deletes detected\n";
}
}
} instance;
void* allocate(size_t size, const char* kind_of_memory, size_t token) throw (std::bad_alloc)
{
void* raw = malloc(size + ALIGNMENT);
if (raw == 0) throw std::bad_alloc();
*static_cast<size_t*>(raw) = token;
void* payload = static_cast<char*>(raw) + ALIGNMENT;
++counter;
std::cerr << "*** allocated " << kind_of_memory << " at " << payload << " (" << size << " bytes)\n";
return payload;
}
void release(void* payload, const char* kind_of_memory, size_t correct_token, size_t wrong_token) throw()
{
if (payload == 0) return;
std::cerr << "*** releasing " << kind_of_memory << " at " << payload << '\n';
--counter;
void* raw = static_cast<char*>(payload) - ALIGNMENT;
size_t* token = static_cast<size_t*>(raw);
if (*token == correct_token)
{
*token = 0xDEADBEEF;
free(raw);
}
else if (*token == wrong_token)
{
*token = 0x177E6A7;
std::cerr << ERR << "wrong form of delete\n";
}
else
{
std::cerr << ERR << "double delete\n";
}
}
}
void* operator new(size_t size) throw (std::bad_alloc)
{
return allocate(size, "non-array memory", 0x5AFE6A8D);
}
void* operator new[](size_t size) throw (std::bad_alloc)
{
return allocate(size, " array memory", 0x5AFE6A8E);
}
void operator delete(void* payload) throw()
{
release(payload, "non-array memory", 0x5AFE6A8D, 0x5AFE6A8E);
}
void operator delete[](void* payload) throw()
{
release(payload, " array memory", 0x5AFE6A8E, 0x5AFE6A8D);
}
Làm cách nào để đảm bảo rằng danh sách lưu ý không theo dõi bộ nhớ của chính nó? Viết một cấp phát? Viết danh sách của riêng tôi thực hiện dựa trên malloc và miễn phí? – fredoverflow
Việc triển khai đầu tiên của tôi về trình gỡ lỗi heap không xâm nhập có thể được tìm thấy [ở đây] (http://stackoverflow.com/questions/2835416/critique-my-non-intrusive-heap-debugger). – fredoverflow