C++ 指针是指向单个项还是指向数组?
我正在编写一个清理实用程序,它将要清理的项存储在一个元组中,并且在出现错误的情况下,将对元组中的每个项执行适当的操作。元组中的一些典型项是指向堆上分配的对象的指针。当我的清理处理程序决定删除这些对象时,它必须知道是应该使用普通的delete表达式还是delete表达式的数组形式(delete[])。我将如何确定元组中的项是指向单个对象的指针还是指向对象数组的指针 这是一本书。以下是与此问题相关的部分:C++ 指针是指向单个项还是指向数组?,c++,c++11,typetraits,C++,C++11,Typetraits,我正在编写一个清理实用程序,它将要清理的项存储在一个元组中,并且在出现错误的情况下,将对元组中的每个项执行适当的操作。元组中的一些典型项是指向堆上分配的对象的指针。当我的清理处理程序决定删除这些对象时,它必须知道是应该使用普通的delete表达式还是delete表达式的数组形式(delete[])。我将如何确定元组中的项是指向单个对象的指针还是指向对象数组的指针 这是一本书。以下是与此问题相关的部分: template<unsigned index, typename... Types&g
template<unsigned index, typename... Types>
struct TupleItemDeleter
{
void operator() (std::tuple<Types...>& t)
{
std::cout << "Deleting item at index " << index << std::endl;
delete std::get<index>(t); //HOWTO: delete[] or delete?
TupleItemDeleter<index - 1, Types...>{}(t);
}
};
template<typename... Types>
struct TupleItemDeleter<0, Types...>
{
void operator() (std::tuple<Types...>& t)
{
std::cout << "Deleting item at index 0" << std::endl;
delete std::get<0>(t); //HOWTO: delete[] or delete?
}
};
template<typename... Types>
void deleter(std::tuple<Types...>& t)
{
constexpr auto tupleSize = std::tuple_size<std::tuple<Types...>>::value;
TupleItemDeleter<tupleSize - 1, Types...>{}(t);
}
模板
结构TupleItemDeleter
{
void运算符()(std::tuple&t)
{
std::cout您不能仅从指针判断它是指向单个对象还是数组-这就是为什么有两种形式的delete
,因为编译器无法分辨这两种形式。您需要以其他方式跟踪信息
由于您已经在使用元组,也许您可以在那里存储一个指示符。您不能仅从指针判断它是指向单个对象还是数组-这就是为什么有两种形式的删除
,因为编译器无法分辨这两种形式。您需要以其他方式跟踪信息
由于您已经在使用元组,也许您可以在那里存储一个指示符。您要问自己的问题是,代码当前如何知道指针指向数组,即它如何知道它可以安全地索引指针,以及索引的数量是多少
如果有这样的模型,即使它只是一个约定,并且没有很好地编码,那么您需要找到某种方法将该约定传递到元组中
一种方法是为需要删除数组的元素存储一对指针/成员,即使您不使用计数,或者创建一个也包含计数的智能指针包装器,并开始在更多代码中使用它们
另一个想法是,某些类可能总是数组分配的,而其他类则永远不会。您可以自己编写一个特性,告诉您每个类的行为,或者您可以添加一个destroy()对每个类执行正确操作的类。您还可以假定任何指向简单类型的指针都可能是数组分配的,例如字符指针可能是字符串
如果您可以更积极地替换类的分配器,而不实际编辑遗留代码,那么您可以决定出现问题的类的所有运算符new()实际调用计数为1的运算符new;或者所有运算符new()将地址记录到哈希表中。如果找到地址,则需要使用运算符delete。要问自己的问题是,代码当前如何知道指针指向数组,即它如何知道它可以安全地索引指针,以及索引的数量
如果有这样的模型,即使它只是一个约定,并且没有很好地编码,那么您需要找到某种方法将该约定传递到元组中
一种方法是为需要删除数组的元素存储一对指针/成员,即使您不使用计数,或者创建一个也包含计数的智能指针包装器,并开始在更多代码中使用它们
另一个想法是,某些类可能总是数组分配的,而其他类则永远不会。您可以自己编写一个特性,告诉您每个类的行为,或者您可以添加一个destroy()对每个类执行正确操作的类。您还可以假定任何指向简单类型的指针都可能是数组分配的,例如字符指针可能是字符串
如果您可以更积极地替换类的分配器,而不实际编辑遗留代码,那么您可以决定出现问题的类的所有运算符new()实际调用计数为1的运算符new;或者所有运算符new()将地址记录到哈希表中。如果找到地址,则需要使用运算符delete。这里是龙。您需要重新考虑整个设计。请阅读“C++RAII”和“C++std::unique\u ptr”。问题是我正在处理一个遗留的代码库,我没有进行大规模更改的奢侈。对我来说,合并像这样侵入性较小的东西是最好的方法。指针只是一个地址。它不知道存储是如何分配的。喘息。比我好。这可能需要一天、一周或一个月的时间正在寻找代码以找出摆脱这一混乱局面的最佳方法。恐怕这帮不了你。这里是龙。你需要重新思考整个设计。阅读“C++RAII”和“C++std::unique\u ptr”。问题是我正在处理一个遗留的代码库,我没有进行大规模更改的奢侈。对我来说,合并像这样侵入性较小的东西是最好的方法。指针只是一个地址。它不知道存储是如何分配的。喘息。比我好。这可能需要一天、一周或一个月的时间正在寻找代码以找出摆脱这一混乱局面的最佳方法。恐怕我帮不了你。评论不错。:-@JiveDadson我曾考虑将其作为评论保留,但这确实是答案。我在其他论坛上被指责将答案作为评论保留。这是一个公平的答案。我有一个稍微不同但相关的问题:如果r不知道指针指向一个数组,当您使用delete[]时,运行时如何知道要清理多少内存?@DigitalEye如果它是一个结构而不是一个元组,这可能是可能的。但在这种情况下,可能会有更好的方法。但遗憾的是,元组的字段没有名称。元组的用户必须知道谁是第一个。他不可能在不破坏代码的情况下将字段添加到元组中。我们甚至不知道