C++函数里申请的动态数组,怎么释放

C++函数里申请的动态数组,如何释放
#include <stdio.h>
#include <STACK>
#include <iostream>
using namespace std;

/*判断表达式是否合法*/
bool IsValid(char * str)
{
if(NULL==str)
return false;
stack<char> op;
while (*str)
{
if(*str=='(')
op.push(*str++);
else if (*str==')')
{
if(op.empty())
return false;
else
{
op.pop();
}
str++;
}
else
str++;
}
if(op.empty())
return true;
else
return false;
}
//消除中间括号
char *Elimination_brackets_1(char *str)
{
if(NULL==str)
return str;
char *temp=new char[strlen(str)+1];
char *result=temp;
*temp=*str;
//cout<<*temp<<endl;
temp++;
str++;
while (*str!='\0')
{
if (*str==')'||*str=='(')
{
str++;
continue;
}
(*temp++)=*str++;
}
*temp++=')';
*temp='\0';
cout<<result<<endl;
return result;
}
void main()
{
char str[]="(1,(2,3),(4,(5,6),7))";
if(IsValid(str))
{
//printf(Elimination_brackets_1(str));
char *p=Elimination_brackets_1(str);
cout<<str<<endl;
cout<<p<<endl;
delete []p;
cout<<p<<endl;

}

getchar();
}


请问,这个动态数组,我最后用指针指向它,释放时候用delete []p,还是用delete p;

两个运行的结果都是不能访问内存了,出了乱码,但是这个乱码的原因会不会是我只释放了第一个字符的内存,导致后面的内存不能有效访问呢?
------解决方案--------------------
应该是 delete [] p, 对 new []的内存, 用不加[]的delete结果未定义.  
------解决方案--------------------
delete p;和delete []p; 的区别是前者只调用一次析构函数,后者会调用多次析构函数。
因为new的时候调用过多次构造函数,所以delete时也需要调用多次析构函数,不管是不是做过类型转换。
------解决方案--------------------
用new+[ ] 的形式分配的内存,是应该用delete [ ] 的形式去释放,当你用delete [ ] 的形式去释放的时候,它会去查找内存中保存的数组的大小,以便知道要从哪删到哪,如果仅仅是delete,则不会认为是在删一个数组。请问楼主所说的“出了乱码”是指什么?如果是delete后再输出,那必须是乱码。