关于new和delete的问题

longmei 2003-10-20 12:52:17
自从国庆之后,我都很久没来csdn了,主要是在家研究《c++ primer》呢,然后就发现了很多从前没有发现到的问题,其中之一如下:
new和delete的问题:
比如说,我在一个按钮的点击事件中用new建立的一个任意类型的一个对象,对他进行一系列的操作,然后可以返回一些结果。然而,在这个事件结束的时候就被系统默认的delete了,在下一个按钮的点击事件中,刚才用new建立的那个对象名字自然就用不了了。除非我在全局作用域中用new建立这个对象。
可是高手们经常说,尽量不要建立全局变量,但是对于这种情况应该用什么样的办法使对象的生存期延长呢?
...全文
60 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
longmei 2003-10-21
  • 打赏
  • 举报
回复
对了~ 忘了加析构,呵呵~
longmei 2003-10-21
  • 打赏
  • 举报
回复
我用了这类的形式然后可以了,是参考人家高手们做的singleton实现的例子做的:
class a
{
int p;//假设是变量
protected:
a();
public:
static a* create();

int Add();
};

a::a()
{
p=0;
}
a* a::create()//第一次
{
static a m;
return &m;
}

int a::Add()
{

p = p+1;
return p;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
a *m=a::create();
int b;
b=m->Add();
Edit1->Text=b;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
a *m=a::create();
int b;
b=m->Add();
Edit2->Text=b;
}
//---------------------------------------------------------------------------

每次按按钮,值都会增加,按第二个按钮也值一样跟着增加,
谢谢各位~ 有问题我再问~~
jiangchun_xn 2003-10-21
  • 打赏
  • 举报
回复
new 和 delete的所谓成对出现并不一定是显式的。就是说:角色不一定是一个人,我new ,我可以不delete ....

1.vcl中的Component的owner概念,owner删除了,自己也会被删除,而这时使用delete,可能会发生错误。

2.delete this,一种危险有用的做法,使用者很可能不知道自己到底要不要delete...

3.智能指针:指针的删除导致对象的删除,有点垃圾收集的味道,同样,我们不需要delete


。。。还有不少。。注意了就行。
longmei 2003-10-21
  • 打赏
  • 举报
回复
编译的时候这部分有问题:
int create()//第一次
{
p = null;
p = new int();
}
编译器告诉我他不认识p ,若做成内联函数,则告诉我Member a::p 必须不能在一个对象中使用,不过你的思路我明白大概了,现在正在设法改进这个类。
supwjhuLoveCjj 2003-10-21
  • 打赏
  • 举报
回复
封装在一个结构或是类中用不就行了。这样安全性也可以控制呀
BoyMgl 2003-10-21
  • 打赏
  • 举报
回复
主要是为了单元间的数据传输:extern
yunxly 2003-10-21
  • 打赏
  • 举报
回复
longmei(龙妹) :

时间很紧,上班。写得不怎么好,其实可以更简单。其思想是静态单实例模式。

看看"高手"的思路:

class a
{
int *p;//假设是变量

static int create();
static int free();
static int Add();
}
int create()//第一次
{
p = null;
p = new int();
}

int Add();
{
if (p==null)
return -1;
*p = *p+1;
return 0;
}

int free();
{
if (p!=null)
{
delete p;
p = null;
}
}
用之前,按钮事件之外,任何位置都可以,a.create(),
用的时候,任何位置都可以,包括在按钮事件当中,写a.add()就可以了。
用完了,任何位置都可以,就用a.free().

teatool 2003-10-21
  • 打赏
  • 举报
回复
没有不让你用呀,只是如果有别的法可用就别用,要不C++中就取消了全局变量了
aliker 2003-10-21
  • 打赏
  • 举报
回复
全局变量该用还是要用的。面向对象程序设计并不抛弃传统的结构化程序设计,在面向对象方法解决问题复杂或不方便时仍可用结构化程序设计方法。汽车比自行车快并不意味着就不要自行车而只要汽车。
longmei 2003-10-21
  • 打赏
  • 举报
回复
又是你~` 哈哈~
让高手见笑了~
jiangchun_xn 2003-10-21
  • 打赏
  • 举报
回复
龙妹总是问singleton的东西哦。
佣工7001 2003-10-20
  • 打赏
  • 举报
回复
尽量不用,不是绝对不用
踏岸寻柳 2003-10-20
  • 打赏
  • 举报
回复
很多时候还是要用全局的...

不过对于函数中临时声明、new出来用的,应该遵循即用即删的原则!
Bkoklam 2003-10-20
  • 打赏
  • 举报
回复
不用全局变量的目的在于节约内存,但内存该用还是要用。做为一般的程序员,应该以目的为重。当然,对资源应该有一个节省的概念,但软件要完成的功能才是第一位的。BCB不会自动释放,除非关闭你的主程序为止,若你是新手而且你的程序不大放心的用全局变量(用4或5个全局变量松松,一点问题都没有),达到目的是最重要的!!!。
fastcall 2003-10-20
  • 打赏
  • 举报
回复
非要用局部指针的话 在指针前 加static 也就是用静态指针。
static MyType* p=NULL;
if(p==NULL)
p=new MyType();
......
iloverainbow 2003-10-20
  • 打赏
  • 举报
回复
"我在一个按钮的点击事件中用new建立的一个任意类型的一个对象,对他进行一系列的操作,然后可以返回一些结果。然而,在这个事件结束的时候就被系统默认的delete了"

如果被系统删除了的话,那么new与delete就不会是成对出现了。
这就是书上特别说明它们要成对使用呢的原因,显性new,显性delete!

longmei 2003-10-20
  • 打赏
  • 举报
回复
yunxly(低手):

你的意思是不是在类中安排一个静态的数据成员,每次建立类的实例的时候,不初始化这个数据宠元,而是使用数据成员上次调用过之后的值?
ydx 2003-10-20
  • 打赏
  • 举报
回复
然而,在这个事件结束的时候就被系统默认的delete了,这个意思应该是超出他的作用域了。
yunxly 2003-10-20
  • 打赏
  • 举报
回复
高手很少用全局变量,在于其设计模式,类的结构,整个程序的框架建的好。像你这个问题,类写的好,比如先判断变量是否已经申请,没有就申请;有了就用以前的,不需申请。在加上下静态的方法,就解决了。

yunxly 2003-10-20
  • 打赏
  • 举报
回复
"我在一个按钮的点击事件中用new建立的一个任意类型的一个对象,对他进行一系列的操作,然后可以返回一些结果。然而,在这个事件结束的时候就被系统默认的delete了"
这句话错了。
1.BCB不像C#,java,可以自动释放,除非整个程序被关掉。将有操作系统以操作进程的方式释放内存。
2.new一个对象,在bcb中就会占用一块内存,若不用delete,就会一直占用内存。下次再new的时候,又申请了一块新的内存。上次申请的内存就成为垃圾内存,除非你保留上次申请内存的指针(类似你说的全局变量),否则就不能用。
做个循环,点击10000次这个按钮,看看内存就知道了。
3.不用全局变量的思路,就把这个全局变量写成一个类。封装一些方法就可以了。这样比较符合“高手”的思路。
加载更多回复(4)

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧