Malloc,free和多个指针,它如何工作?

时间:2019-05-28 22:05:56

标签: c++ pointers malloc free

我有多个指针指向使用单个malloc分配的动态分配的内存。

int *p1, *p2;
p1 = (int*)malloc(sizeof(int) * 10);
p2 = &p1[5];
free(p2);
p1[5] = 3;
p1[6] = 5;

现在我的问题是'free(p2)'语句会做什么?它会在p1 [5]之前释放内存吗?在p1 [5](即p1 [6],p1 [7],..)前面使用内存是否安全

2 个答案:

答案 0 :(得分:4)

释放未经class SkillUpFragment : Fragment() { lateinit var skills_spin : Spinner private var model: SharedViewModel?=null private var myCompositeDisposable: CompositeDisposable? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.skill_up_fragment, container, false) myCompositeDisposable = CompositeDisposable() loadData() return view } private fun loadData(){ val token = SharedPrefManager.getInstance(activity!!.applicationContext).loginResponse.token val parsedJWT = JWT(token!!) val metaId = parsedJWT.getClaim("id") val id = metaId.asInt() myCompositeDisposable?.add(RetrofitClient.instance.getSkillsToChoose(Id(id!!)) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(this::handleResponse)) } private fun handleResponse(skills: List<Skill>){ skills_spin = view!!.findViewById(R.id.skill_spinner) val skills_name = ArrayList<String>() var i = 0 for (skill in skills){ skills_name.add(skills[i].name) i++ } val array = arrayOfNulls<String>(skills_name.size) skills_name.toArray(array) skills_spin.adapter = ArrayAdapter<String>(view!!.context, android.R.layout.simple_list_item_1,array) skills_spin.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { var skill_res = array.get(position)!! model = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java) frag_button_choose.setOnClickListener { model!!.setText(skill_res) } } } } } / malloc编辑的指针是未定义的行为。 某些分配器(例如glibc)有时可以检测到它,并通过一条calloc错误消息确定性地使程序崩溃,但是从技术上讲,如果您执行该操作,则将失去有关程序行为的所有保证。

答案 1 :(得分:3)

您无法预测此功能的行为,因为它是未定义的行为

从参考文献:

  

取消分配先前由malloc()calloc()aligned_alloc,(自C11起)或realloc()分配的空间。

     

如果ptr是空指针,则该函数不执行任何操作。

     

如果ptr的值不等于malloc()calloc()realloc()或{{1} }(自C11起)。

     

aligned_alloc() C++ Reference

强调我的观点:在这种情况下使用free将涉及释放一个指针,而该指针不是通过使用任何这些函数获得的;它是通过转换从free获得的指针而获得的,因此无效。

我对可能发生什么的最佳猜测是分段错误;但这取决于您的编译器,而不是您或我可以保证的。

所以不要这样做。