C++中的new与delete

C++中对象数组创建时,主要注意的点有:虚函数和带参数的构造函数,当出现虚函数时,对象数组中如通过父对象指向子对象,因为需要做Slice,析构时会造成指针错误引发内存泄露。测试程序如下:

class A {
private:
	int num;
public:
	A(int a):num(a){}
	virtual ~A() {}
	virtual void g() {cout << "A::g()" << endl;}
};

class B:virtual public A{
private:
	int num;
public:
	B():B(0) {}
	B(int b):A(b),num(b){}
	virtual ~B() {}
	virtual void g() {cout << "B::g()" << endl;}
};

如出现下列方式使用对象:

A *pa = new B[2];

delete[] pa;

Valgrind检测会造成内存泄露,正确的方式为:

delete[] dynamic_cast<B*>(pa);

当无默认构造函数时,创建数组对象的方式如下:

A *pa = new A[2](10);//编译器无法通过编译,C++无此语言规范

vector<A*> pVa(10,new A(10));

时间: 2024-08-08 00:34:37

C++中的new与delete的相关文章

oracle 中删除表 drop delete truncate

oracle 中删除表 drop delete truncate 相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名(后面不跟where语句,则也删除表中所有的数据) truncate table 表名 区别 首先delete 属于DML,当不commit时时不生效的 而truncate 和 drop 则是直接生效的,不能回滚. truncate 和 delete 不删除表的结构,只是针对表中的内容删除 drop语句

Oracle中的Truncate和Delete语句

Oracle中的Truncate和Delete语句 首先讲一下,truncate命令: 语法:TRUNCATE  TABLE  table; 表格里的数据被清空,存储空间被释放. 运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退. 只有表格的创建者或者其他拥有删除任意表格权限的用户(如DBA)才能清空表格. TRUNCATE  TABLE  dept30; Table truncated. ---------------------------------------------

深入理解c++中的new与delete

一,new与delete的细节 假如有下面的代码: string *sp = new string("a value"); string *arr = new string[10]; 整个new的语句可以分为三步完成, 首先,编译器使用名为operator new(operator new[])的标准库函数,该函数的作用是分配一块足够大的.原始的空间.第二步,编译器运行相应的构造函数构造对象,第三步,编译器将得到的对象首地址返回. 当在程序中使用 type *p = new type(

[转]C++中关于new和delete的使用

转载的地址 近一直在啃 C++ Primer 中文版第4版,发现 C++中new和delete应用遍布全书,现对其使用作简单总结.在C++中,可以使用new和delete动态创建和释放数组或者单个对象,现在对它们的使用一一道来. 1.创建动态数组 数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在.对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度:同时,动态分配的数组一直存

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用. 开启Session Session实例由SessionFactory开启获得,例如: Configuration config = new Configuration().configure(); SessionFact

sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与delete区别. 我们先看一下truncate table的说明:删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE在功能上与没有WHERE子句的DELETE语句相同:但是,TRUNCATE TABLE速度更快,使用的系统资源和事务日志资源更少. truncate table的语

delphi中的copy,delete,pos和leftstr,RightStr的用法

copy 举个例子:str := “123456”;str1 := Copy(Str,2,3);结果就是 str1 等于 234.Copy有3个参数,第一个是你要处理的字符串,第二个是你要截取的开始位置,第3个是截取位数.当你的第3个参数大于字符长度,那么效果就是取 开始位置 后的所有字符.str1 := Copy(Str,2,10); 结果就是str1 等于 23456. leftstr和pos 假设字符串是 S := ’Delphi is the BEST’, 那么 LeftStr(S, 5

c++中的new 和delete

new是用来动态申请内存空间的C++中的一个关键字.delete是用来删除new所申请空间对象的. 想深入理解new请看:http://blog.csdn.net/songthin/article/details/1703966 delete p和delete [] p的区别: 1.int* p = new int(20); delete p; 2.int*p = new int[10]();//数组带初始化 delete [] p; 从上面两个小例子,可以看出delete p 用来删除单个元素

Sql语句中的truncate,delete,drop的区别

相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 不同点: 1. truncate 和 delete 只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain).触发器(trigger).索引(index):依赖于该表的存储过程/函数将保留,但是变为 invalid 状态. 2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效:如果有相