new 问题

todd0 2003-06-30 01:31:01
new (char*)[10]

new char*[10]
有什么区别?

另外哪位有`C++ TEMPLATE : THE COMPLETE GUIDE', 多多感谢。
...全文
18 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueweizhong 2003-07-01
  • 打赏
  • 举报
回复
是关于
new new-type-id

new (type-id)
的语法问题。

todd0的说法是正确的。
短歌如风 2003-06-30
  • 打赏
  • 举报
回复

  我的理解:

 这是一个操作符优先级的问题:
  char * [10]:由于[]操作符(Postfix Operator)比*(Unary Operator)操作符优先级高,所以这是一个“数组”,它的元素是“指针”,指针指向“字符”
  (char *)[10]:由于强制优先级(括号)最高,所以这是一个指针,指向一个数组,数组元素是指针(我本来认为应该用char(*)[]表示,可是通不过)。
  从而可以看出,new char * [10]分配了一个指针数组(调用operator new []),new (char*)[10]分配了一个指向数组的指针(调用operator new)

  不过实际情况并不是这样的:
  在BCB6中:
#include <iostream>
namespace mynew
{
void * operator new (unsigned int Size)
{
std::cout << "new:" << Size << std::endl;
return ::operator new (Size);
}
void * operator new [](unsigned int Size)
{
std::cout << "new[]:" << Size << std::endl;
return ::operator new (Size);
}
}
#define TRACK(X) std::cout<<"******** " << #X << " ************" << std::endl; X

typedef char * PChar;

main()

{
TRACK(mynew::new char*[10]);
TRACK(mynew::new (char*)[10]);
std::cin.get();
}

输出结果为:
******** mynew::new char*[10] ************
new[]:40
******** mynew::new (char*)[10] ************
new:4
和我推测的一样。

而在Dev C++ 4.9.8.0中(由于不支持mynew::new这样的语法,对源代码有所修改):
#include <iostream>
#define TRACK(X) std::cout<<"******** " << #X << " ************" << std::endl; X
namespace mynew
{
void * operator new (unsigned int Size)
{
std::cout << "new:" << Size << std::endl;
return ::operator new (Size);
}
void * operator new [](unsigned int Size)
{
std::cout << "new[]:" << Size << std::endl;
return ::operator new (Size);
}
void test ()
{
TRACK(new char*[10]);
TRACK(new (char*)[10]);
}
}

typedef char * PChar;

main()

{
mynew::test();
std::cin.get();
}
输出结果为:
******** new char*[10] ************
new[]:40
******** new (char*)[10] ************
new[]:40
两种情况竟然一样!

而在VC6中,根本不支持new (char*)[10]这样的语法。

结论是最好不要用这样复杂的new表达式,应该用typedef为复杂类型定义类型标识符,然后在去new。
todd0 2003-06-30
  • 打赏
  • 举报
回复
Yssss1980(浪子雪影): 有没有上面那本书啊?

这两个应该是不一样的
new (char*)[10] -> (new (char*))[10]
new char*[10] -> new (char*[10])

语法上通过,含义不一样。可以去看一下STROUSTRUP书后附录A的语法描述。

我想要书,有书就给分。
Yssss1980 2003-06-30
  • 打赏
  • 举报
回复
DEV C++中都可以编译通过

本质上没有区别

谢谢
Yssss1980 2003-06-30
  • 打赏
  • 举报
回复
前者在VC6编译不通过
而后者可以通过

谢谢

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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