メインコンテンツ

エラーの解決: コード ジェネレーターは、MATLAB クラスの C++ デストラクターを生成できませんでした

問題

MATLAB® コードから C++ クラスをもつ再呼び出し可能なコードを生成すると、コード実行時にスタック オーバーフローが発生する可能性が増加します。コード生成が停止し、次のメッセージが表示される可能性があります。

コード ジェネレーターは、MATLAB クラス 'y' の C++ デストラクターを生成できませんでした。生成されたコードは例外セーフでありません。C++ デストラクターの生成を有効にするには、[再呼び出し可能なコードを生成] (MultiInstanceCode) 構成パラメーターを無効にしてください。

このメッセージは、次のすべての条件に該当する場合に表示される可能性があります。

  • クラスを使用する MATLAB コードから C++ コードを生成する。

  • [MATLAB クラスから C++ クラスを生成] パラメーターを使用して、MATLAB クラスから C++ クラスを生成するようにコード ジェネレーターに指示する。

  • [再呼び出し可能なコードを生成] パラメーターを使用して、再呼び出し可能なコードを生成するようにコード ジェネレーターに指示する。

  • MATLAB コード内のクラスのデストラクターが永続変数をもつか、永続変数を宣言して使用する別の関数を呼び出す。

考えられる解決策

生成するコードのタイプに応じて、次のいずれかの解決策を試してください。

スタック制限の引き上げ

MATLAB クラスに対応する C++ クラスをもつ再呼び出し可能なコードを生成する場合は、次のいずれかの方法を使用してスタック制限を引き上げます。

  • [コード生成設定] ダイアログ ボックスで、[最大スタック使用量] パラメーターの値を増やす。

  • スタンドアロン コード生成の構成オブジェクトで、StackUsageMax プロパティの値を増やす。

コード生成が正常に実行され、コード ジェネレーターが再呼び出し可能なコードで C++ クラスを生成したことが示されるまで、スタックの値を 2 倍にしてスタック制限を引き上げます。

メモ

設定可能な最大スタック制限は、システムのリンカーによって異なります。既定のスタック サイズは、オペレーティング システムとシステム構成によって異なります。

MATLAB コード内のクラスのデストラクターは、永続変数をもつことも、永続変数を宣言する別の関数を呼び出すこともしてはなりません。

再呼び出し可能なコードの無効化

MATLAB クラスに対応する C++ クラスを含むコードを生成するには、再呼び出し可能なコードの生成を無効にできます。次のいずれかを行います。

  • コード構成オブジェクトで、MultiInstanceCode プロパティを false に設定する。

  • [コード生成設定] ダイアログ ボックスで、[再呼び出し可能なコードを生成] チェック ボックスをオフにする。

クラスの代わりに構造体を生成

コード ジェネレーターの既定の動作を変更して、MATLAB クラスに対応する構造体を生成できます。次のいずれかを行います。

  • コード構成オブジェクトで、CppPreserveClasses プロパティを false に設定する。

  • [コード生成設定] ダイアログ ボックスで、[MATLAB クラスから C++ クラスを生成] チェック ボックスをオフにする。

参考

トピック