2013-06-19 2 views
1

내 솔루션에서 나는 C++ (vs2010) 프로젝트의 일부 메소드를 실행하는 C++/CLI (vs2012) 프로젝트를 가지고 있습니다. 여기 는 네이티브 코드의 서명입니다 :std :: vector <std :: vector <int>>을 C++에서 C++/CLI로 반환하는 방법은 무엇입니까?

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 

어떻게 될 수 있습니까?

+1

특히 다른 컴파일러/버전간에 DLL 경계를 넘어 STL 형식을 전달하고 반환하는 것은 권장되지 않습니다. – Medinoc

+0

함수가 'Downsample'이며 동일한 DLL에서이 함수를 호출합니까? – pogorskiy

+0

@pogorskiy 아니요, 그들은 다른 DLL입니다. –

답변

0

해결. 난에 서명을 변경 :

std::vector<std::vector<int>*>* Pcl::Downsample(std::vector<CloudPointNative>& points) 

및 외부 DLL에서 생성 된 객체가 외부 DLL에서 삭제해야하기 때문에 벡터

void Pcl::Free(std::vector<std::vector<int>*>* clusters) 
{ 
    for(int i = 0; i < clusters->size(); i++) 
    { 
     delete (*clusters)[i]; 
    } 
    delete clusters; 
} 

을 삭제하는 무료 방법을 추가했다.

관련 문제