阵列的指针和其他东西
Arrays of Pointers and something else
所以我们有以下代码,其中说明了"指针数组"(我认为)
main() {
int *array[3];
int x = 10, y = 20, z = 30;
array[0] = &x;
array[1] = &y;
array[2] = &z;
return 0;
}
现在,假设不是int
s,它们是您创建的对象类的一种类型。
因此,我想从此数组中删除成员(即,通过删除关键字调用其破坏者并将对象销毁,但要使指针保持不错。)
如果我的怀疑是正确的,那是不可能的,而我唯一的选择是将数组的内容复制到新数组(我想删除的一个),然后删除上一个数组(从整体上均具有所有元素),而我将新的阵列分配给指针array
我很高兴有人能确认或纠正我的怀疑,特别是因为"指针的数组"是如此误导。谢谢。
假设您有一个Foo
Foo a;
这是 foo对象的实例。它分配在堆栈上。当它们从范围中脱离时,它将被破坏,。
如果您想明确破坏对象,请在 heap 中分配它。
Foo* a = new Foo(); // Allocated - Constructor called.
delete a; // Freed - Destructor called.
要记住的一个好的规则是,对于每个new
,都应该有一个匹配的delete
,不再,也不少。在您的示例中,您没有使用new
关键字,因此没有地方对于delete
关键字。
Foo* array[3];
是 Foo
对象指针的 stack 上的数组。他们什么都没有指出,他们是不启用的。当该阵列不在范围内时,它将被摧毁。请记住,它只会销毁内容的内容,这些内容是指示的,不会试图释放他们指向的任何东西。
array[0] = new Foo();
现在,该数组在堆上保存指向Foo
对象的指针。它还包含2个非初始化的指针。如果让array
脱离范围,则您将是泄漏内存。为了防止这种情况,您必须释放Foo
对象。
delete array[0];
array[0] = NULL;
将您的非专业化或删除的指针设置为无效也是一个好习惯。这样,您可以明确地看到它没有指向。您现在可以执行此类检查:
if(array[0])
{
// We know there is an object here, since it's not NULL.
delete array[0];
array[0] = NULL; // Helps prevent trying to free memory more than once.
}
据我了解您的问题,它的作用是有两个原因:
- 您将无法删除这些元素(int或a),因为它们居住在堆栈上,而不是在堆中,它们将在隔离时会自动删除;
- 删除或移动阵列不会删除其元素,因为它已经说过上面。
至于"擦除数组的内容[1]",可以通过:
来完成:array[1] = NULL;
如果我正确理解您。
相关文章:
- 结构和双指针隐藏在其他结构中,多层混淆
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 包含指向其他结构的指针向量的结构
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 在指针中对其他信息进行编码
- char* 除了作为C++中的指针之外,还有其他功能吗?
- C++ 指向其他类函数的指针函数
- 当动态库中的指针仍被其他库使用时,如何删除该指针
- 指向用随机指针归档的其他类对象的指针的c++向量
- 为什么可以将所有类型转换为其他指针类型?
- 常量字符 * 与其他指针不同
- C++ 减少使用指针、原始指针或其他指针和/或返回可为空的非指针
- 单例、shared_ptr、原始指针或其他指针
- 将指针设置为 nullptr 是否会影响指向同一地址的其他指针
- C++ 多态函数以 void * 和其他指针类型为参数:是否被认为是模棱两可的
- 我可以将nullptr强制转换为其他指针类型吗
- 将浮点数*或其他指针转换为无符号字符*
- 检查指针在其他指针中删除对象后是否为 NULL
- 从基类型到其他指针的转换
- 创建指向其他指针的指针数组