您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-15 20:02 483 查看
#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一次的问题。

但反正都写了 就发出来吧,不喜勿喷!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  static C++ delete acm输入