delete是否检查指针类型?

cfvmario 2014-07-28 09:16:47
可以这样做吗?

char* cp = new char[100];
int* ip = (int*)cp;
delete ip;
ip = cp = NULL;
...全文
218 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
movsd 2014-07-28
  • 打赏
  • 举报
回复
如果保证用在无析构的类型上,我认为没有问题。
cfvmario 2014-07-28
  • 打赏
  • 举报
回复
引用 11 楼 movsd 的回复:
delete在删除内存前会根据指针类型调用析构函数,比如有这样一个类

class A
{
	public:
		A(){}
		~A()
		{
			printf("~A");
		}
};
A *pa=new A; delete pa; // 会调用A的析构函数,输出“~A” A *pa=new A; delete (int *)pa; // 不会调用A的析构函数
嗯,这个当然知道,不过和我的问题无关,我自己的代码保证不会将array2_new()用在带析构函数的对象上,只用在基本类型和无指针成员的struct上
movsd 2014-07-28
  • 打赏
  • 举报
回复
delete在删除内存前会根据指针类型调用析构函数,比如有这样一个类

class A
{
	public:
		A(){}
		~A()
		{
			printf("~A");
		}
};
A *pa=new A; delete pa; // 会调用A的析构函数,输出“~A” A *pa=new A; delete (int *)pa; // 不会调用A的析构函数
cfvmario 2014-07-28
  • 打赏
  • 举报
回复
引用 9 楼 lisong694767315 的回复:
[quote=引用 5 楼 cfvmario 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] vector不比你自己new的动态数组性能差,反而可能更好。[/quote] 对于一维数组大概如此。但我是二维的,用二重vector的话,每个vector总是std分别分配的。我就调一次new分配r*c这么多,然后只赋值指针,不是少了内存操作吗?
神奕 2014-07-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] vector不比你自己new的动态数组性能差,反而可能更好。
mujiok2003 2014-07-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] 你现在这个实现并不比vector高效。
mujiok2003 2014-07-28
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。

std::vector< std::vector<T> >   data(r);
for(int i =0; i < r; ++i){
  data[i].resize(c);
}
勤奋的小游侠 2014-07-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] 为什么你觉得vector的效率比int差?先别下那么主观的结论。还是看下more effective stl,和做一下实验才知道。
cfvmario 2014-07-28
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。
神奕 2014-07-28
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
+1
mujiok2003 2014-07-28
  • 打赏
  • 举报
回复
使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
cfvmario 2014-07-28
  • 打赏
  • 举报
回复
补充一句,我知道C++的对象析构函数问题,我自己肯定保证不会把这个函数用于带析构函数的对象类型的东西,只会用于内部类型,以及纯不带指针的struct。在这个前提下,第二种写法是不是可以
cfvmario 2014-07-28
  • 打赏
  • 举报
回复
其实我的应用场合是这样的,因为要频繁使用变量维度的二维数组,所以写成函数实现之

template <typename T>
inline T** array2_new(int r, int c)
{
	T** p = new T*[r];
	int* data = new T[r*c];
	memset(data, 0, r*c*sizeof(T));

	for(int i=0; i<r; i++)
		p[i] = data + i*c;
	return p;
}

template <typename T>
inline void array2_delete(T** p)
{
	delete[] p[0];
	delete[] p;
}
如果delete与指针类型无关,那第二个函数可不可以这样写?

inline void array2_delete(void** p)
{
	delete[] *p;
	delete[] p;
}
ri_aje 2014-07-28
  • 打赏
  • 举报
回复
引用 1 楼 cfvmario 的回复:
其实我的应用场合是这样的,因为要频繁使用变量维度的二维数组,所以写成函数实现之

template <typename T>
inline T** array2_new(int r, int c)
{
	T** p = new T*[r];
	int* data = new T[r*c];
	memset(data, 0, r*c*sizeof(T));

	for(int i=0; i<r; i++)
		p[i] = data + i*c;
	return p;
}

template <typename T>
inline void array2_delete(T** p)
{
	delete[] p[0];
	delete[] p;
}
如果delete与指针类型无关,那第二个函数可不可以这样写?

inline void array2_delete(void** p)
{
	delete[] *p;
	delete[] p;
}
不行。c++11 5.3.5/3 In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined. array2_delete 的写法,dynamic type 是 T,static type 是 void,不一样。
yangyunzhao 2014-07-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] 个人认为性能瓶颈,通常不在于数据结构的选择,而在于设计、在于算法,甚至代码书写习惯。 性能检测工具,现在太多了,也非常容易使用。建议检测以后再有针对性优化
movsd 2014-07-28
  • 打赏
  • 举报
回复
引用 10 楼 cfvmario 的回复:
[quote=引用 9 楼 lisong694767315 的回复:] [quote=引用 5 楼 cfvmario 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] 使用vector of vector吧, 不要自己操心new/delete这些琐事, 遵循RAII手法。
我要做的东西性能重要,用不起std这东西。[/quote] vector不比你自己new的动态数组性能差,反而可能更好。[/quote] 对于一维数组大概如此。但我是二维的,用二重vector的话,每个vector总是std分别分配的。我就调一次new分配r*c这么多,然后只赋值指针,不是少了内存操作吗?[/quote] 如果不需要对已填充了数据的数组改变维度,这样做确实会快一些

64,654

社区成员

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

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