C++ 是否可以断言指针指向数组?

C++ 是否可以断言指针指向数组?,c++,C++,我正在创建解构器,我想断言我的指针float*queue指向一个float数组。编译器似乎不喜欢 assert([]队列) 如果我使用 assert(队列!=NULL); 删除[]队列 。谢谢你的帮助。不,你不能 您可以通过将指针与nullptr(或null在C++11之前的版本中;null自C++11之后不应使用)进行比较来测试指针是否具有空指针值,但您永远无法判断非空指针是否指向有效对象,该对象是否是数组的一部分,或者该对象/数组是否由new/new[]分配 程序员的工作是确保代码永远不会达

我正在创建解构器,我想断言我的指针
float*queue
指向一个float数组。编译器似乎不喜欢

assert([]队列)

如果我使用

assert(队列!=NULL);
删除[]队列

。谢谢你的帮助。

不,你不能

您可以通过将指针与
nullptr
(或
null
在C++11之前的版本中;
null
自C++11之后不应使用)进行比较来测试指针是否具有空指针值,但您永远无法判断非空指针是否指向有效对象,该对象是否是数组的一部分,或者该对象/数组是否由
new
/
new[]
分配

程序员的工作是确保代码永远不会达到需要但不可用上述信息的状态

最简单的方法是永远不要使用原始
new
/
delete
。只使用
std::vector
std::unique\u ptr


在调用
delete[]
之前,也不需要检查空指针
delete[]
可以用空指针调用,在这种情况下它什么都不做。您不能使用非空指针调用
delete[]
,该指针没有
new[]
返回的值(并且该指针尚未被
delete[]
编辑)。这将有未定义的行为。

不,您不能

您可以通过将指针与
nullptr
(或
null
在C++11之前的版本中;
null
自C++11之后不应使用)进行比较来测试指针是否具有空指针值,但您永远无法判断非空指针是否指向有效对象,该对象是否是数组的一部分,或者该对象/数组是否由
new
/
new[]
分配

程序员的工作是确保代码永远不会达到需要但不可用上述信息的状态

最简单的方法是永远不要使用原始
new
/
delete
。只使用
std::vector
std::unique\u ptr



在调用
delete[]
之前,也不需要检查空指针
delete[]
可以用空指针调用,在这种情况下它什么都不做。您不能使用非空指针调用
delete[]
,该指针没有
new[]
返回的值(并且该指针尚未被
delete[]
编辑)。这将有未定义的行为。

不,您不能。我建议你问一下你的实际问题代码,因为你的问题表明你有一些基本的设计缺陷。你可以研究typeof和decltype,但这似乎对“指针”没有太大帮助好吧,我正在从头开始为学校创建一个队列。队列的大小在运行时决定,因此我认为创建动态数组是实现代码的最佳方式。我创建了一个构造函数,它接受队列大小的参数,但是,他们希望我们使用一个没有参数的构造函数。现在,我知道我的驱动程序代码总是会生成一个数组,但我不想假设在调用解构器时总是会有一个新的float[capacity]
@walnut@Nate在实践中,您应该始终使用
std::vector
。如果不允许使用,则
新浮点[容量]
是正确的。队列应该是一个类,
队列
指针应该是该类的私有成员。只有您实现的成员函数应该(能够)更改指针。通过这种方式,您可以确保它始终是空指针(当您将其设置为空指针时)或指向分配有
new float[…]的
float
数组的指针。不允许任何外部代码更改指针。那么您就不需要所要求的检查了。@Nate是的,您需要总是用一个合理的值初始化所有非类类型,最好是在声明它们时立即初始化(顺便说一句,因为C++11也适用于类成员的类内部)。只有类类型可以具有初始化为合理初始值的默认构造函数。不,您不能。我建议你问一下你的实际问题代码,因为你的问题表明你有一些基本的设计缺陷。你可以研究typeof和decltype,但这似乎对“指针”没有太大帮助好吧,我正在从头开始为学校创建一个队列。队列的大小在运行时决定,因此我认为创建动态数组是实现代码的最佳方式。我创建了一个构造函数,它接受队列大小的参数,但是,他们希望我们使用一个没有参数的构造函数。现在,我知道我的驱动程序代码总是会生成一个数组,但我不想假设在调用解构器时总是会有一个新的float[capacity]
@walnut@Nate在实践中,您应该始终使用
std::vector
。如果不允许使用,则
新浮点[容量]
是正确的。队列应该是一个类,
队列
指针应该是该类的私有成员。只有您实现的成员函数应该(能够)更改指针。通过这种方式,您可以确保它始终是空指针(当您将其设置为空指针时)或指向分配有
new float[…]的
float
数组的指针。不允许任何外部代码更改指针。那么你就不需要你要求的检查了。@Nate是的,你需要总是用一个合理的值初始化所有的非类类型,最好是在你声明它们时立即初始化(顺便说一句,因为C++11在类内部为类成员工作,正如我们所说的