std::list<TCHAR*> 请问会导致内存访问异常或者内存泄露吗?

新手上路,请多包涵
// tcharTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <list>
#include <tchar.h>


void SetList(std::list<TCHAR*>& _list)
{
    _list.push_back(_T("ref1"));
    _list.push_back(_T("ref2"));
    _list.push_back(_T("ref3"));
    _list.push_back(_T("ref4"));
    _list.push_back(_T("ref5"));


    for (auto it1 = _list.begin(); it1!= _list.end(); ++it1)
    {
        std::cout<<_T("set list  function: ")<<*it1<<std::endl;
    }

}


std::list<TCHAR*> ReturnList()
{
    std::list<TCHAR*> list;
    list.push_back(_T("return1"));
    list.push_back(_T("return2"));
    list.push_back(_T("return3"));
    list.push_back(_T("return4"));
    list.push_back(_T("return5"));

    for (auto it2 = list.begin(); it2!= list.end(); ++it2)
    {
        std::cout<<_T("return_list  function: ")<<*it2<<std::endl;
    }

    return list;
}



int _tmain(int argc, _TCHAR* argv[])
{
    //引用
    std::list<TCHAR*> ref_list;
    SetList(ref_list);
    printf("\n");
    for (auto it1 = ref_list.begin(); it1!= ref_list.end(); ++it1)
    {
        std::cout<<_T("set list main: ")<<*it1<<std::endl;
    }
    printf("\n");

    //返回值
    std::list<TCHAR*> return_list;
    return_list = ReturnList();
    printf("\n");
    for (auto it2 = return_list.begin(); it2!= return_list.end(); ++it2)
    {
        std::cout<<_T("return list main")<<*it2<<std::endl;
    }


    system("pause");
    return 0;
}

std::list<TCHAR> ReturnList() 出栈后访问list是否可能出现THCAR被释放导致访问异常? 两个函数放的TCHAR* ,用完这个list后需要list.clear()吗?

阅读 2.8k
2 个回答
  1. std::list<TCHAR> ReturnList() 出栈后访问list是否可能出现THCAR被释放导致访问异常?

    不会出现访问异常。
    函数 std::list<TCHAR*> ReturnList() 函数返回值会发生一次拷贝。
  2. 两个函数放的TCHAR* ,用完这个list后需要list.clear()吗?

    不需要,因为不会造成内存泄漏。
    其中主要为,list 中的元素类型 TCHAR* 指向字符常量(位于只读存储区),不需要释放

在给定的代码中,ReturnList 函数返回的是 std::list<TCHAR*> 类型,而不是 std::list<TCHAR> 类型。因此,栈上的 TCHAR 不会被释放,也不会导致访问异常。

SetList 函数中,传递的是引用 _list,因此在 main 函数中对 ref_list 进行迭代时,引用的 _list 仍然有效,不需要手动清空。同样地,在 ReturnList 函数中,返回的 std::list<TCHAR*> 类型的副本会在 main 函数中赋值给 return_list,所以在函数结束后,return_list 拥有自己的副本,也不需要手动清空。

总结起来,给定的代码中不需要手动清空 std::list,因为不会出现 TCHAR 被释放导致访问异常的情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题