struct指针数组的析构问题

这个问题比较隐蔽.
#include "stdafx.h"
#include "1.h"//定义了结构体
#include <iostream>
#include <stdlib.h>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{	
	plant p1;
	p1.p_flower=new flower[10];
	p1.num=10;
	char a[10];
	for (int i=0;i<10;i++)
	{
	    p1.p_flower[i].name=new char[20];
	    strcpy(p1.p_flower[i].name,"aa");
	//要用strcpt而不能直接赋值;如果p1.p_flower[i].name="aa"会导致这样的问题:
        //1)给p1.p_flower[i].name分配的空间成了没有指针指向的垃圾地址,地址泄露发生了
        //2)p1.p_flower[i].name这个指针指向了常量区,无法进行后面的delete操作
		strcpy(p1.p_flower[i].color,"bb");
	}
	for (int j=0;j<10;j++)
	    cout<<"第"<<j<<"个植物是:"<<p1.p_flower[j].name
                <<"   颜色是:"<<p1.p_flower[j].color<<endl;
	for (int k=0;k<10;k++)
	{
	    delete[] p1.p_flower[k].name;//一个new 对应一个delete
	     cout<<k<<"个植物被析构\n";
	}
	delete[] p1.p_flower;
	system("pause");
	return 0;
}


Reference:http://zhidao.baidu.com/question/81948054.html






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,释放结构体数组通常涉及到两个关键步骤:首先遍历并释放单个结构体成员中的资源,然后释放整个数组所占用的内存空间。 ### 步骤一:释放结构体成员 假设我们有一个名为`MyStruct`的结构体,并且其中包含了一个需要手动管理的动态分配的对象: ```cpp struct MyStruct { int id; std::unique_ptr<int> dynamicData; // 使用std::unique_ptr自动管理动态分配的内存 }; // 示例:创建MyStruct的实例并为其分配动态数据 MyStruct example = {1, std::make_unique<int>(42)}; ``` 当`dynamicData`不再需要时,我们需要确保其正确的析构。由于这里使用了`std::unique_ptr`,当`example`离开作用域时,`dynamicData`会被自动释放。如果使用的是普通的指针或其他需要手动管理的资源,则需要显式地调用销毁函数。 ### 步骤二:释放结构体数组 一旦处理完每个结构体内的资源,接下来需要释放数组本身占用的内存。这可以通过直接操作数组或使用标准库提供的容器完成。下面展示了如何释放一个简单的`std::vector<MyStruct>`实例: ```cpp std::vector<MyStruct> myStructArray; // 向向量添加结构体实例 myStructArray.push_back(example); // 遍历数组并释放资源 for (auto &s : myStructArray) { if (s.dynamicData != nullptr) { delete s.dynamicData.get(); // 释放动态数据 } } // 现在我们可以安全地释放整个向量的内存 delete[] myStructArray.data(); ``` 请注意,在这个示例中,我们使用`delete[]`来释放原始数组分配的内存。这是因为`std::vector`底层是一个指向静态分配内存的指针,所以你需要直接访问这个指针来释放内存。 ### 相关问题: 1. **如何检查一个结构体内是否包含需要手动管理的资源(如动态分配的对象),并在退出前正确释放它们?** - 可以通过在结构体内添加状态变量或属性来跟踪是否已经对资源进行了初始化,然后在退出之前手动调用相应的销毁方法或函数。 2. **在C++中,除了使用`std::unique_ptr`外,还有哪些常见的方法可以用于自动管理动态分配的内存?** - 包括智能指针如`std::shared_ptr`、`std::weak_ptr`等以及模板元编程技术如`boost::ptr_container`。 3. **为什么在某些情况下,使用`new`和`delete`而不是智能指针管理内存可能会引入内存泄漏的风险?** - `new`和`delete`的操作容易出错,例如忘记调用`delete`或使用错误的对象,导致内存泄露。此外,程序设计中可能出现的多线程同步问题也可能是潜在风险之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值