- 我使用C++编译器是旧版本的实例化对象(C++ 98也许?)
- 我不能动态地从使用的东西系统池分配内存像新的,malloc
- 我可以使用内置的操作系统调用malloc从我定义的堆数组。
我遇到一些奇怪的行为(程序崩溃)当我这样做分配和从用户控制的存储器池
class cBaseClass /* pure abstract */
{
public:
virtual void ifFunc(void) = 0;
virtual ~cBaseClass() = 0;
}
inline cBaseClass::~cBaseClass()
{
}
class cDclass:cBaseClass
{
public:
cDclass();
~cDclass();
void ifFunc(void); /* implement the pure virtual */
}
cDclass::cDclass(void)
{
printf("[0x%X] derived constructor called\n", this);
}
cDclass::~cDclass(void)
{
printf("[0x%X] derived destructor called\n", this);
}
void cDclass::ifFunc(void)
{
printf("[0x%X] ifFunc called from derived class\n", this);
}
uchar_t myHeap[4096];
int main (void)
{
cDclass* pMyPtr = NULL;
uint32_t i = 0;
(void) memset(myHeap, 0, sizeof(myHeap)/sizeof(myHeap[0]);
for(i = 0; i < 20; i++)
{
pMyPtr = myHeap[i * sizeof(cDclass) + 4];
*pMyPtr = cDclass();
pMyPtr->ifFunc(); /* Crash */
}
}
我看到的是,派生类的构造函数将被called..then其析构函数被调用然后崩溃。 我误以为* pMyPtr = cDclass()构造一个类,然后在pMyPtr指定的地址上创建该类的副本? 我这样说是因为当我删除 pMyPtr = cDClass() 并创建一个虚拟变量来存储cDclass的一个实例,然后使用memmove它不再崩溃。
我不确定您需要包含“”才能使用展示位置新功能。 –
@DavidHaim''是标准中唯一指定'operator new(size_t,void *)'的地方。如果你不使用任何头文件而使用它,g ++和clang ++都会抱怨。 –
aschepler