我有多个指针指向使用单个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],..)前面使用内存是否安全
答案 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
获得的指针而获得的,因此无效。
我对可能发生什么的最佳猜测是分段错误;但这取决于您的编译器,而不是您或我可以保证的。
所以不要这样做。