作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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
类。 strdup
和 new[]
是让您负责内存管理的原始操作,您确实希望避免这种情况。原因是,如果所有成员都有一个工作拷贝构造函数(对于赋值和移动也类似),则不需要为一个类编写拷贝构造函数。但是如果你只有一个 char*
成员,你突然不得不写下所有这些。 std::string
类有一个主要职责:封装单个 char*
并提供复制/移动/赋值。
关于c++ - vector 析构函数在 _CrtIsValidHeapPointer 处失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20189520/
我是一名优秀的程序员,十分优秀!