static和new连用,并且delete多次出现的有趣问题

#include "stdio.h"
#include "stdint.h"
#include<algorithm>
#include<vector>
/*
2
4 8 1 1 1 1 1 3 1 1
5 6 3 3 2 1 1 1

KHOOOOB!
HUTUTU!
*/

using namespace std;

void dataPorcess(int16_t cake_side, int16_t cake_num, int16_t *eachSide)
{

}

int main()
{
    int16_t caseNum = 0;
    int16_t caksSide = 0;
    int16_t cakePiece = 0;

    scanf("%hd",&caseNum);

    for(int16_t i = 0; i < caseNum; i++)
    {
        int16_t receiveDataCount = 0;
        while(true)
        {
            int16_t tempReceive = 0;
            int16_t scanfRetrun = scanf("%hd", &tempReceive);   // 忘记最后还要点一下回车。。。。。。
            if(scanfRetrun == 1)
            {
                receiveDataCount ++;
                if(receiveDataCount == 1)
                {
                    caksSide = tempReceive;
                }
                else if(receiveDataCount == 2)
                {
                    cakePiece = tempReceive;
                }
                else
                {
                    static int16_t *pEachPiceSide = new int16_t[cakePiece];

                    pEachPiceSide[receiveDataCount - 3] = tempReceive;

                    if(receiveDataCount == cakePiece + 2)
                    {
                        dataPorcess(caksSide, cakePiece, pEachPiceSide);

                        if(i == caseNum - 1)
                        delete []pEachPiceSide;

                        break;
                    }
                }
            }
            else if(scanfRetrun == 0)
            {
                scanf("%*c");
            }
            else // EOF
            {
                break;
            }

        }

    }

    return 0;
}

先直接上个正确代码,这是一个简单的acm读取数据并且处理的程序 http://poj.org/problem?id=1020

主要遇到的问题是标红的地方!

在else 里面必须使用 static 来定义 pEachPiceSide 这个指针,否则第二次进入循环后又会重新new一个空间。用static可以完美解决这个问题。

可是刚开始我是没有在delete前面加if条件语句的,也就是每次dataprocess处理完就会删除一次指针。

最后的结果导致内存泄漏!

debug发现除了第一次delete发挥了他的作用,剩下的delete都没有用。

其实是因为new一次过后只能delete一次,之所以还能用这个指针是因为指针所代表的地址是还存在的,只是编译器把这个地址所代表的东西给收回了。

写到这个发现也没什么大不了的,就是一个简单的new一次 只能delete一次的问题。

但反正都写了 就发出来吧,不喜勿喷!

猜你喜欢

转载自blog.csdn.net/u012465304/article/details/77199273