new对象数组时的内存布局


#include <iostream>
#include <limits>

using namespace std;

#define SAFE_DELETE(x) \
{ \
    if (NULL != (x)) \
    { \
        delete (x); \
        (x) = NULL; \
    } \
}

#define SAFE_DELETE_ARY(x) \
{ \
    if (NULL != (x)) \
    { \
        delete[] (x); \
        (x) = NULL; \
    } \
}

class CA
{
public:
    CA()
    {
        setter_m_iTest(-1);
    }

    ~CA() {}

    void setter_m_iTest(int iIn) {m_iTest = iIn;}
    int getter_m_iTest() {return m_iTest;}

private:
    int m_iTest;
};

void fnTestClass();
void clear_cin();

int main(int argc, char** argv, char** envp)
{
    fnTestClass();

    cout << "END, press any key to quit" << endl;
    clear_cin();
    getchar();

    return 0;
}

void fnTestClass()
{
    int i = 0;
    int iTmp = 0;
    const int iCntAry = 4;
    CA* pCaAry = NULL;
    CA* pCa = NULL;

    /** new 单个对象时的内存布局
    +	pCa	0x00883e30
    00883E30  01 00 00 00  .... ///< pCa
    */

    pCa = new CA;
    if (NULL != pCa)
    {
        pCa->setter_m_iTest(1);
        SAFE_DELETE(pCa); ///< delete后, 原来的数据变为 EE FE EE FE
    }

    /** new对象数组时的内存布局
    +	pCaAry	0x007d3ddc

      007D3DD8  04 00 00 00  .... ; ///< 类数组元素个数 = 4
      007D3DDC  00 00 00 00  .... ; ///< 类数组开始, CA[0]
      007D3DE0  01 00 00 00  .... ; ///< CA[1]
      007D3DE4  02 00 00 00  .... ; ///< CA[2]
      007D3DE8  03 00 00 00  .... ; ///< CA[3]
    */
    
    pCaAry = new CA[iCntAry];
    if (NULL != pCaAry)
    {
        for (i = 0; i < iCntAry; i++)
        {
            pCaAry[i].setter_m_iTest(i);
        }
    }

    SAFE_DELETE_ARY(pCaAry);

    /** 手工模拟delete删除单个对象
    */

    pCa = new CA;
    if (NULL != pCa)
    {
        pCa->setter_m_iTest(1);
        if (NULL != pCa)
        {
            pCa->~CA();
            free(pCa); ///< ok
            pCa = NULL;
        }
    }

    /** 手工模拟delete删除对象数组
    会报错, 和实际情况不同
    以后再研究 :(
    */

    // 会报错, 和实际情况不同
//     pCaAry = new CA[iCntAry];
//     if (NULL != pCaAry)
//     {
//         iTmp = *((int*)pCaAry - 1);
//         for (i = 0; i < iTmp; i++)
//         {
//             pCaAry[i].setter_m_iTest(i);
//             pCaAry[i].~CA();
//         }
// 
//         free(pCaAry); ///< ! crash
//         pCaAry = NULL;
//     }

    // 会报错, 和实际情况不同
//     pCaAry = new CA[iCntAry];
//     if (NULL != pCaAry)
//     {
//         iTmp = *((int*)pCaAry - 1);
//         for (i = 0; i < iTmp; i++)
//         {
//             pCaAry[i].setter_m_iTest(i);
//             pCaAry[i].~CA();
//             free(pCaAry + i); ///< ! crash
//         }
// 
//         pCaAry = NULL;
//     }
}

void clear_cin()
{
    cin.clear();
    cin.sync();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值