关于new的用法

蓝鹰 2011-10-10 05:01:19
虽然知道new的功能和malloc类似,但在这里,我无法理解:

#include<stdlib.h>
#include<iostream>
using namespace std;
class CEmployee
{
public:
int m_ID;
char m_Name[128];
char m_Depart[128];
CEmployee()
{
memset(m_Name,0,128);
memset(m_Depart,0,128);
}
virtual void OutputName()
{
cout<<"员工姓名"<<m_Name<<endl;
}
};
class COperator:public CEmployee
{
public:
char m_Password[128];
void OutputName()
{
cout<<"操作员姓名"<<m_Name<<endl;
}
};
int main(int argc,char *argv[])
{
CEmployee *pWorker=new COperator(); //定义CEmployee 指针,调用COperator 构造函数
strcpy(pWorker->m_Name,"MR");
pWorker->OutputName();
delete pWorker;
system("pause");
return 0;
}



对于标红的地方,这样做和直接用构造函数定义一个coperator对象有什么区别?,顺便问一句,new COperator和new COperator()等效吗? 在下新人,请多包涵
...全文
213 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 blackeaglex 的回复:]

追加30分,再问一个问题,我用COperator b;然后 delete &b,为何程序貌似假死,一定要用指针吗?
[/Quote]

new和delete必须对称地使用,如果一个对象不是new出来的,就不要试图用delete去销毁它。
scutth 2011-10-12
  • 打赏
  • 举报
回复
回楼主追加的问题:
如果用delete删除一个不是用new分配的内存地址,理论上来说是不合法的。
但是C++标准没有明确定义如何处理这种情况,所以对这种情况的处理也依赖于编译器。
具体信息可以参看C++ primer(第四版) p152关于delete的详解。
wo_de_fen_dou 2011-10-12
  • 打赏
  • 举报
回复
学习了
蓝鹰 2011-10-12
  • 打赏
  • 举报
回复
谢谢各位的回答,令在下获益匪浅。
radiohead001 2011-10-11
  • 打赏
  • 举报
回复
1. CEmployee *pWorker=new COperator();
CEmployee Worker.
用new的这个对象是创建在堆上,pWorker是个指针,指向这个对象。最后需要delete释放。
没用New的创建在栈上,不需要delete。

2. new COperator和new COperator()等效.
fcly1981826ly 2011-10-11
  • 打赏
  • 举报
回复
学习,,,,,,
Defonds 2011-10-11
  • 打赏
  • 举报
回复
new只是运算符
追求执着 2011-10-11
  • 打赏
  • 举报
回复
直接使用构造函数,创建对象是在栈中,和变量相同,在作用域结束之后系统会释放
使用new创建对象,在堆中进行创建,程序结束之后要手动去释放,也就是delete掉,不然会内存泄露
其他的上面都有解答,
wb_james 2011-10-11
  • 打赏
  • 举报
回复

++++++++
另外malloc是c里面的标准库函数,new是c++里新增的,new操作符还可以被重载

[Quote=引用 10 楼 agony_null 的回复:]

1.new COperator,这是调用默认构造函数
new COperator(),调用无参构造函数
2.new不只是分配内存,还会调用类的构造函数。
同理delete会调用析构函数,而malloc只管分配内存,
不管类成员的初始化,同样,free不会调用析构函数。
3.new只是运算符,malloc是标准库函数。
[/Quote]
蓝鹰 2011-10-11
  • 打赏
  • 举报
回复
追加30分,再问一个问题,我用COperator b;然后 delete &b,为何程序貌似假死,一定要用指针吗?
Agony_NULL 2011-10-11
  • 打赏
  • 举报
回复
1.new COperator,这是调用默认构造函数
new COperator(),调用无参构造函数
2.new不只是分配内存,还会调用类的构造函数。
同理delete会调用析构函数,而malloc只管分配内存,
不管类成员的初始化,同样,free不会调用析构函数。
3.new只是运算符,malloc是标准库函数。

Vincent_Song 2011-10-11
  • 打赏
  • 举报
回复
new COperator调用默认构造函数。对于动态分配的内存是需要程序员自己负责管理,所以需要手动回收,否则会出现内存泄露。希望能够够帮到你!
zjcbzjcb 2011-10-11
  • 打赏
  • 举报
回复
new的话是放在堆区 需要手动释放
5t4rk 2011-10-10
  • 打赏
  • 举报
回复
楼主看看new的实现就明白跟malloc的关系了


void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}

return (p);
}
imhxb 2011-10-10
  • 打赏
  • 举报
回复
()指的是值初始化
假如是new int()则把这个数初始化为0,不加()就是未初始化
对于有默认构造函数的类类型,加上()和不加是一样的
pengzhixi 2011-10-10
  • 打赏
  • 举报
回复
直接构造个对象那么对象是存放在栈上,而不是堆上。

至于new COperator和new COperator();你这里没任何区别。
昵称很不好取 2011-10-10
  • 打赏
  • 举报
回复
new COperator,这是调用默认构造函数
new COperator(),调用无参构造函数
only_lonely 2011-10-10
  • 打赏
  • 举报
回复
new COperator和new COperator() 没区别

直接用构造函数定义一个coperator对象有什么区别 内存分配不一样,一个在栈中(直接构造函数),一个是在堆中

栈分配内存速度快,内存自动管理,但很小
堆分配内存慢,需要手工管理内存,但很大

权衡利弊的权利由程序员掌握
蓝鹰 2011-10-10
  • 打赏
  • 举报
回复
见鬼,根本没标红

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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