1

私のソリューションには、C++ (vs2010) プロジェクトでいくつかのメソッドを実行する C++/CLI (vs2012) プロジェクトがあります。ネイティブ コードの署名は次のとおりです。

    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

どうすればいいの?

4

1 に答える 1

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 でも削除する必要があるためです。

于 2013-06-20T09:39:27.687 に答える