- 我使用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