gpt4 book ai didi

c++ - vector 析构函数在 _CrtIsValidHeapPointer 处失败

转载 作者:行者123 更新时间:2023-11-28 07:16:21 26 4
gpt4 key购买 nike

我是 C++ 的新手,需要使用它来为 C# 应用程序创建 shell 命名空间扩展。

我有下一个代码:

#ifdef MAKEDLL
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllimport)
#endif
//...
DLLEXPORT class NativeFtp
{
public:
DLLEXPORT void Initialize(string uniqeId);
DLLEXPORT vector<FTPSITEACCESS> GetSites();
} _NativeFtp;
//...
vector<FTPSITEACCESS> NativeFtp::GetSites()
{
vector<FTPSITEACCESS> vec;

FTPSITEACCESS st;
st.SiteName = "ftp://10.20.3.251/";
st.Password = "";
st.Login = "";

vec.push_back(st);

return vec;
}

其他图书馆:

STDMETHODIMP CShellFolderImpl::EnumObjects ( HWND hwndOwner, DWORD dwFlags,
LPENUMIDLIST* ppEnumIDList )
{
// Skipped

vector<FTPSITEACCESS> ftpSites = m_ftp.GetSites();
vector<char*> names;

/*for(vector<FTPSITEACCESS>::iterator it = ftpSites.begin(); it != ftpSites.end(); ++it) {
//char* ch = new char[(*it).SiteName.size()+1];
//ch[(*it).SiteName.size()] = '/0';
//std::copy((*it).SiteName.begin(),(*it).SiteName.end(),ch);
//names.push_back(strdup(ch)); //TODO:FREE
}*/

// Skipped

return hr;
}

此代码在 'return hr' 上失败在 _CrtIsValidHeapPointer由 vector 的析构函数调用。我试着做 NativeFtp::GetSites()返回 vector<FTPSITEACCESS>*vector<FTPSITEACCESS*>*然后在'return hr'之前删除它,但它以同样的方式失败。

最佳答案

FTPSITEACCESS 将被复制。 copy ctor 没有显示,但我的 Crystal 球告诉我它坏了。

如果您来自 C#,只需使用 C++ 中的 std::string 类。 strdupnew[] 是让您负责内存管理的原始操作,您确实希望避免这种情况。原因是,如果所有成员都有一个工作拷贝构造函数(对于赋值和移动也类似),则不需要为一个类编写拷贝构造函数。但是如果你只有一个 char* 成员,你突然不得不写下所有这些。 std::string 类有一个主要职责:封装单个 char* 并提供复制/移动/赋值。

关于c++ - vector 析构函数在 _CrtIsValidHeapPointer 处失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20189520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com