nlib_malloc()
, nlib_free()
等をnmalloc/nfree
を利用する実装に置き換えたり、new/delete
を置き換えるサンプルです。
なお、 NMalloc.h にNLIB_REPLACE_MALLOC_NEW
というマクロが定義されていて、このサンプルで行っていることをより簡単に行うことが可能です。
#include <new>
#include <vector>
#if 1
extern "C" {
}
}
}
}
#ifndef NN_PLATFORM_CTR
void*
operator new(
size_t size) {
return nlib_malloc(size); }
void*
operator new[](
size_t size) {
return nlib_malloc(size); }
void
}
void operator delete(
void* ptr,
size_t size,
const std::nothrow_t&)
NLIB_NOEXCEPT {
}
void operator delete[](
void* ptr,
size_t size,
const std::nothrow_t&)
NLIB_NOEXCEPT {
}
#else
void*
operator new(
size_t size)
throw(std::bad_alloc) {
return nlib_malloc(size); }
void operator delete(
void* ptr)
throw() {
nlib_free(ptr); }
void*
operator new(
size_t size,
const std::nothrow_t&)
throw() {
return nlib_malloc(size); }
void*
operator new[](
size_t size)
throw(std::bad_alloc) {
return nlib_malloc(size); }
void operator delete[](
void* ptr)
throw() {
nlib_free(ptr); }
void*
operator new[](
size_t size,
const std::nothrow_t&)
throw() {
return nlib_malloc(size); }
#endif
#else
#endif
typedef std::vector<int> MyVec;
static bool vector_pushback() {
MyVec vec;
for (int i = 0; i < 10000; ++i) {
vec.push_back(i);
if (i == 5000) {
}
}
for (int i = 0; i < 10000; ++i) {
if (vec[i] != i) return false;
}
vec.clear();
MyVec(vec).swap(vec);
return true;
}
static bool vector_pushback_with_reserve() {
MyVec vec;
vec.reserve(10000);
for (int i = 0; i < 10000; ++i) {
vec.push_back(i);
}
for (int i = 0; i < 10000; ++i) {
if (vec[i] != i) return false;
}
nlib_printf(
"#\n# heap status: i == 10000(with reserve)\n#\n");
return true;
}
#ifdef NLIB_HAS_VIRTUALMEMORY
settings->
size = 1024 * 512;
}
#else
const size_t heapmem_size = 1024 * 512;
settings->addr = heapmem;
settings->size = heapmem_size;
settings->heap_option = 0;
}
#endif
static bool SampleMain(int, char**) {
return vector_pushback() && vector_pushback_with_reserve();
}
NLIB_MAINFUNC