在我的解决方案中,我有C ++ / CLI(vs2012)项目,它在C ++(vs2010)项目中执行某些方法。 这是本机代码的签名:
void Pcl::Downsample(std::vector<CloudPointNative>& points, std::vector<std::vector<int>>& clusters)
以下是我在C ++ / CLI方面的执行方式:
std::vector<std::vector<int>> clusters;
pcl->Downsample(points, clusters);
然后我尝试迭代群集:
for (int clusterIndex = 0; clusterIndex < clusters.size(); clusterIndex++)
{
auto cluster = clusters[clusterIndex];
簇的大小为7,向量中的每个项都包含int的向量。我可以在本机调试器中看到这个。一旦我回到托管方(C ++ / cli项目),我就会遇到问题。 如果clusterIndex == 0和clusterIndex == 5,它可以正常工作。但是对clusterIndex的任何其他值抛出AccessViolationException。
auto cluster0 = clusters[0]; // works
auto cluster1 = clusters[1]; // AccessViolationException
auto cluster5 = clusters[5]; // works
这怎么可能?
答案 0 :(得分:0)
解决。我已将签名更改为:
std::vector<std::vector<int>*>* Pcl::Downsample(std::vector<CloudPointNative>& points)
并添加了Free方法来删除矢量
void Pcl::Free(std::vector<std::vector<int>*>* clusters)
{
for(int i = 0; i < clusters->size(); i++)
{
delete (*clusters)[i];
}
delete clusters;
}
因为外部DLL中创建的对象也应该在外部DLL中删除。