C#GUI EXE和C++;DLL分配取消分配

C#GUI EXE和C++;DLL分配取消分配,c#,c++,dll,allocation,C#,C++,Dll,Allocation,我有一个简单的C#GUI,上面有一个按钮。点击按钮时,调用C++ DLL,在C++ DLL中进行一些计算。 C++的GUI(可执行文件)导入一个C++ DLL,像这样: class Call_Link_DLL { [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_LoadFDD")] public static extern System.IntPtr OPS_Link_LoadFDD([In,Out,

我有一个简单的C#GUI,上面有一个按钮。点击按钮时,调用C++ DLL,在C++ DLL中进行一些计算。

C++的GUI(可执行文件)导入一个C++ DLL,像这样:

class Call_Link_DLL
    {
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_LoadFDD")]
        public static extern System.IntPtr OPS_Link_LoadFDD([In,Out,MarshalAs(UnmanagedType.LPStr)] string char_Ptr_octave_bin_dir);
    }

SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_LoadFDD(char_Ptr_octave_bin_dir);
FDD*FDD_Ptr_Object=new FDD();
delete FDD_Ptr_Object;//de-allocating makes C# executable (GUI) not able to re-execute without having to close GUI!

C++内部DLL,我正在分配一个指向类对象的指针:

class Call_Link_DLL
    {
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_LoadFDD")]
        public static extern System.IntPtr OPS_Link_LoadFDD([In,Out,MarshalAs(UnmanagedType.LPStr)] string char_Ptr_octave_bin_dir);
    }

SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_LoadFDD(char_Ptr_octave_bin_dir);
FDD*FDD_Ptr_Object=new FDD();
delete FDD_Ptr_Object;//de-allocating makes C# executable (GUI) not able to re-execute without having to close GUI!

当C++的DLL用它的计算完成时,指针就这样被分配:

class Call_Link_DLL
    {
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_LoadFDD")]
        public static extern System.IntPtr OPS_Link_LoadFDD([In,Out,MarshalAs(UnmanagedType.LPStr)] string char_Ptr_octave_bin_dir);
    }

SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_LoadFDD(char_Ptr_octave_bin_dir);
FDD*FDD_Ptr_Object=new FDD();
delete FDD_Ptr_Object;//de-allocating makes C# executable (GUI) not able to re-execute without having to close GUI!
<>但是问题是:当我点击GUI按钮第一次时,C++ DLL运行并生成结果。但是当我第二次点击GUI按钮时,程序崩溃了。我必须关闭GUI并再次单击GUI按钮以重新执行。令人困惑的是,当我注释掉取消分配行(
delete FDD\u Ptr\u Object;
)时,当我第二次、第三次按下GUI按钮时,GUI工作得非常完美,依此类推。我想知道是否有人遇到这样的问题。谢谢

编辑:我在此处发布所有详细信息:

下面是一个用C#开发的简单GUI。它有一个按钮,点击按钮时,将调用一个C++ DLL(名为Link Kydll。DLL)。p>

下面是C语言中导入一个名为Link Kdll的C++ DLL的代码:DLL:< /P>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;

namespace GUI_Call_Link_DLL
{
    class Call_Link_DLL
    {
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_LoadFDD")]
        public static extern System.IntPtr OPS_Link_LoadFDD([In,Out,MarshalAs(UnmanagedType.LPStr)] string char_Ptr_octave_bin_dir);
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_RunFDD_getFreqDomainResults")]
        public static extern System.IntPtr OPS_Link_RunFDD_getFreqDomainResults([In, Out, MarshalAs(UnmanagedType.LPStr)] string char_Address, [In, Out, MarshalAs(UnmanagedType.I4)]int int_NumChann, [In, Out, MarshalAs(UnmanagedType.I4)]int int_SamplingFreq);
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_feedFDD_setNaturalFreqSelectedByUser")]
        public static extern System.IntPtr OPS_Link_feedFDD_setNaturalFreqSelectedByUser([In, Out, MarshalAs(UnmanagedType.LPStr)]string char_Address_File_naturalFreqSelectedByUser);
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_RunFDD_getModeShapesResults")]
        public static extern System.IntPtr OPS_Link_RunFDD_getModeShapesResults();
        [DllImport(@"Link_DLL.dll", EntryPoint = "OPS_Link_UnloadFDD")]
        public static extern System.IntPtr OPS_Link_UnloadFDD();
    }
}
单击按钮时,C#中调用Link#DLL.DLL的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace GUI_Call_Link_DLL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //you can copy "Octave-3.6.1" folder and subfolders anywhere you want and give binary path here:
            string char_Ptr_octave_bin_dir = @"C:\Software\Octave-3.6.1\bin\";

            string char_Address = openFileDialog1.FileName;
            int int_NumChann = int.Parse(textBox1.Text);
            int int_SamplingFreq = int.Parse(textBox2.Text);

            string char_Address_File_naturalFreqSelectedByUser = "FDD_TEMP_naturalFreqSelectedByUser.txt";

            System.IntPtr SystemIntPtr_ReturnedByDLL;//char* returned by DLL
            string string_ReturnedByDLL = "Good";//convert to string the char* returned by DLL

            try
            {
                SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_LoadFDD(char_Ptr_octave_bin_dir);
                string_ReturnedByDLL = Marshal.PtrToStringAnsi(SystemIntPtr_ReturnedByDLL);
                if (string_ReturnedByDLL != "Good") { throw new Exception(); }

                SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_RunFDD_getFreqDomainResults(char_Address, int_NumChann, int_SamplingFreq);
                string_ReturnedByDLL = Marshal.PtrToStringAnsi(SystemIntPtr_ReturnedByDLL);
                if (string_ReturnedByDLL != "Good") { throw new Exception(); }

                SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_feedFDD_setNaturalFreqSelectedByUser(char_Address_File_naturalFreqSelectedByUser);
                string_ReturnedByDLL = Marshal.PtrToStringAnsi(SystemIntPtr_ReturnedByDLL);
                if (string_ReturnedByDLL != "Good") { throw new Exception(); }

                SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_RunFDD_getModeShapesResults();
                string_ReturnedByDLL = Marshal.PtrToStringAnsi(SystemIntPtr_ReturnedByDLL);
                if (string_ReturnedByDLL != "Good") { throw new Exception(); }

                SystemIntPtr_ReturnedByDLL = Call_Link_DLL.OPS_Link_UnloadFDD();
                string_ReturnedByDLL = Marshal.PtrToStringAnsi(SystemIntPtr_ReturnedByDLL);
                if (string_ReturnedByDLL != "Good") { throw new Exception(); }
            }
            catch (Exception) { MessageBox.Show(string_ReturnedByDLL); }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //show dialog and get result
            DialogResult DialogResult_Object = openFileDialog1.ShowDialog();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

Link KDLL.DLL中的C++代码是:

#include "Link.h"

//Declare handle to FDD_DLL
//This handle is declared within namespace to be accessible from within any function 
namespace namespace_top_of_Link{
    HINSTANCE hDLL=NULL;
}

//Exported function to be called by executable (C# or C++) 
//To load FDD_DLL
//To add dependencies directories to search path
//Dependencies path is determined by executable
extern "C" __declspec(dllexport)
char* OPS_Link_LoadFDD(char* char_Ptr_octave_bin_dir){
    try{
        std::string string_octave_bin_dir = std::string(char_Ptr_octave_bin_dir);//convert char* to std::string
        std::wstring wstring_octave_bin_dir = std::wstring(string_octave_bin_dir.begin(), string_octave_bin_dir.end());// convert std::string to std::wstring
        SetDllDirectory(wstring_octave_bin_dir.c_str());
        //SetDllDirectory((LPCWSTR)L"C:\\Software\\Octave-3.6.1\\bin\\");
        namespace_top_of_Link::hDLL=LoadLibrary((LPCWSTR)L"FDD_DLL.dll");
        if(namespace_top_of_Link::hDLL==NULL){
            throw "FDD DLL or dependencies could not be loaded";
        }
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To run FDD_DLL
//FDD_DLL returns results inside text files
//Results are frequencies and corresponding singular values
extern "C" __declspec(dllexport)
char* OPS_Link_RunFDD_getFreqDomainResults(char* char_Address,int int_NumChann,int int_SamplingFreq){
    try{
        typedef void (*Ptr_OPS_FDD_getFreqDomainResults)(char*, int, int);
        Ptr_OPS_FDD_getFreqDomainResults Ptr_OPS_FDD_getFreqDomainResults_Object=
            (Ptr_OPS_FDD_getFreqDomainResults)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_getFreqDomainResults");
        Ptr_OPS_FDD_getFreqDomainResults_Object(char_Address, int_NumChann, int_SamplingFreq);
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To pass user-selected natural frequencies to FDD_DLL
//User-selected natural frequencies should be inside a text file
//Address of text file is passed to FDD_DLL
extern "C" __declspec(dllexport)
char* OPS_Link_feedFDD_setNaturalFreqSelectedByUser(const char* char_Address_File_naturalFreqSelectedByUser){
    try{
        typedef void (*Ptr_OPS_FDD_setNaturalFreqSelectedByUser)(const char*);
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object;
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object=
            (Ptr_OPS_FDD_setNaturalFreqSelectedByUser)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_setNaturalFreqSelectedByUser");
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object(char_Address_File_naturalFreqSelectedByUser);
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To run FDD_DLL
//FDD_DLL returns results inside text files
//Results are mode shapes at user-selected natural frequencies
extern "C" __declspec(dllexport)
char* OPS_Link_RunFDD_getModeShapesResults(){
    try{
        typedef void (*Ptr_OPS_FDD_getModeShapesResults)();
        Ptr_OPS_FDD_getModeShapesResults Ptr_OPS_FDD_getModeShapesResults_Object=
            (Ptr_OPS_FDD_getModeShapesResults)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_getModeShapesResults");
        Ptr_OPS_FDD_getModeShapesResults_Object();
    }
    catch(char* char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To unload FDD_DLL
extern "C" __declspec(dllexport)
char* OPS_Link_UnloadFDD(){
    try{
        if(FreeLibrary(namespace_top_of_Link::hDLL)==0){//If function can not free, return value is zero
            throw "FDD DLL could not be unloaded";
        }
    }
    catch(char* char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}
#include "FDD.h"

//Declare object of FDD class
//FDD object is declared within namespace to be accessible from within any function
//FDD object pointer will be de-allocated (delete) when done with it
namespace namespace_top_of_FDD{
    FDD*FDD_Ptr_Object=new FDD();
}

//Exported function to be called by Link_DLL
//To initialize FDD object
//To run FDD object methods
//FDD object methods will return results inside text file
//Results are frequencies and corresponding singular values
extern "C" __declspec(dllexport)
void OPS_FDD_getFreqDomainResults(char* char_Address,int int_NumChann,int int_SamplingFreq){
    namespace_top_of_FDD::FDD_Ptr_Object->m_char_Address=char_Address;
    namespace_top_of_FDD::FDD_Ptr_Object->m_int_NumChann=int_NumChann;
    namespace_top_of_FDD::FDD_Ptr_Object->m_int_SamplingFreq=int_SamplingFreq;
    namespace_top_of_FDD::FDD_Ptr_Object->getMatrixOfChannels();
    namespace_top_of_FDD::FDD_Ptr_Object->getCPSD();
    namespace_top_of_FDD::FDD_Ptr_Object->getSVD();
    namespace_top_of_FDD::FDD_Ptr_Object->getFreqDomainResultsPrinted();
    namespace_top_of_FDD::FDD_Ptr_Object->getFreqPlot();
}

//Exported function to be called by Link_DLL
//To pass user-selected natural frequencies from Link_DLL to FDD_DLL
//User-selected natural frequencies should be inside a text file
//Address of text file is passed
//FDD_DLL would read text file
extern "C" __declspec(dllexport)
void OPS_FDD_setNaturalFreqSelectedByUser(const char* char_Address_File_naturalFreqSelectedByUser){
    namespace_top_of_FDD::FDD_Ptr_Object->getNaturalFreqValue(char_Address_File_naturalFreqSelectedByUser);
}

//Exported function to be called by Link_DLL
//To run FDD object methods
//FDD object methods will return results inside text files
//Results are mode shapes at user-selected natural frequencies
//Finally FDD object pointer will be de-allocated (delete)
extern "C" __declspec(dllexport)
void OPS_FDD_getModeShapesResults(){
    namespace_top_of_FDD::FDD_Ptr_Object->get_NaturalFreqIndex_from_NaturalFreqValue();
    namespace_top_of_FDD::FDD_Ptr_Object->getRealModesFromComplexModesAtNaturalFreq();
    namespace_top_of_FDD::FDD_Ptr_Object->getModeShapesNormalized();
    namespace_top_of_FDD::FDD_Ptr_Object->getModeShapesPrinted();
    //namespace_top_of_FDD::FDD_Ptr_Object->getModesPlot();
    namespace_top_of_FDD::FDD_Ptr_Object->getNormalizedModesPlot();
    //namespace_top_of_FDD::FDD_Ptr_Object->getNormalizedModesPlotAtSinglePlot();
    namespace_top_of_FDD::FDD_Ptr_Object->~FDD();
    //delete namespace_top_of_FDD::FDD_Ptr_Object;//de-allocating makes C# executable (GUI) not able to re-execute without having to close GUI!
    //namespace_top_of_FDD::FDD_Ptr_Object=NULL;
}

FDD::FDD()
        :m_char_Address(""),m_int_NumChann(0),m_int_SamplingFreq(0)
    {
    }

FDD::~FDD(){
}

// The rest of the C++ code inside FDD_DLL.dll is just implementation of methods of FDD class...
<> P>实际上,Link Kydll .dll正在加载另一个名为fddydll .dll的C++ dll,fdddll .dll中的C++代码是:

#include "Link.h"

//Declare handle to FDD_DLL
//This handle is declared within namespace to be accessible from within any function 
namespace namespace_top_of_Link{
    HINSTANCE hDLL=NULL;
}

//Exported function to be called by executable (C# or C++) 
//To load FDD_DLL
//To add dependencies directories to search path
//Dependencies path is determined by executable
extern "C" __declspec(dllexport)
char* OPS_Link_LoadFDD(char* char_Ptr_octave_bin_dir){
    try{
        std::string string_octave_bin_dir = std::string(char_Ptr_octave_bin_dir);//convert char* to std::string
        std::wstring wstring_octave_bin_dir = std::wstring(string_octave_bin_dir.begin(), string_octave_bin_dir.end());// convert std::string to std::wstring
        SetDllDirectory(wstring_octave_bin_dir.c_str());
        //SetDllDirectory((LPCWSTR)L"C:\\Software\\Octave-3.6.1\\bin\\");
        namespace_top_of_Link::hDLL=LoadLibrary((LPCWSTR)L"FDD_DLL.dll");
        if(namespace_top_of_Link::hDLL==NULL){
            throw "FDD DLL or dependencies could not be loaded";
        }
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To run FDD_DLL
//FDD_DLL returns results inside text files
//Results are frequencies and corresponding singular values
extern "C" __declspec(dllexport)
char* OPS_Link_RunFDD_getFreqDomainResults(char* char_Address,int int_NumChann,int int_SamplingFreq){
    try{
        typedef void (*Ptr_OPS_FDD_getFreqDomainResults)(char*, int, int);
        Ptr_OPS_FDD_getFreqDomainResults Ptr_OPS_FDD_getFreqDomainResults_Object=
            (Ptr_OPS_FDD_getFreqDomainResults)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_getFreqDomainResults");
        Ptr_OPS_FDD_getFreqDomainResults_Object(char_Address, int_NumChann, int_SamplingFreq);
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To pass user-selected natural frequencies to FDD_DLL
//User-selected natural frequencies should be inside a text file
//Address of text file is passed to FDD_DLL
extern "C" __declspec(dllexport)
char* OPS_Link_feedFDD_setNaturalFreqSelectedByUser(const char* char_Address_File_naturalFreqSelectedByUser){
    try{
        typedef void (*Ptr_OPS_FDD_setNaturalFreqSelectedByUser)(const char*);
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object;
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object=
            (Ptr_OPS_FDD_setNaturalFreqSelectedByUser)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_setNaturalFreqSelectedByUser");
        Ptr_OPS_FDD_setNaturalFreqSelectedByUser_Object(char_Address_File_naturalFreqSelectedByUser);
    }
    catch(char*char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To run FDD_DLL
//FDD_DLL returns results inside text files
//Results are mode shapes at user-selected natural frequencies
extern "C" __declspec(dllexport)
char* OPS_Link_RunFDD_getModeShapesResults(){
    try{
        typedef void (*Ptr_OPS_FDD_getModeShapesResults)();
        Ptr_OPS_FDD_getModeShapesResults Ptr_OPS_FDD_getModeShapesResults_Object=
            (Ptr_OPS_FDD_getModeShapesResults)GetProcAddress(namespace_top_of_Link::hDLL,"OPS_FDD_getModeShapesResults");
        Ptr_OPS_FDD_getModeShapesResults_Object();
    }
    catch(char* char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}

//Exported function to be called by executable (C# or C++)
//To unload FDD_DLL
extern "C" __declspec(dllexport)
char* OPS_Link_UnloadFDD(){
    try{
        if(FreeLibrary(namespace_top_of_Link::hDLL)==0){//If function can not free, return value is zero
            throw "FDD DLL could not be unloaded";
        }
    }
    catch(char* char_Ptr_Exception){
        return char_Ptr_Exception;
    }
    return "Good";
}
#include "FDD.h"

//Declare object of FDD class
//FDD object is declared within namespace to be accessible from within any function
//FDD object pointer will be de-allocated (delete) when done with it
namespace namespace_top_of_FDD{
    FDD*FDD_Ptr_Object=new FDD();
}

//Exported function to be called by Link_DLL
//To initialize FDD object
//To run FDD object methods
//FDD object methods will return results inside text file
//Results are frequencies and corresponding singular values
extern "C" __declspec(dllexport)
void OPS_FDD_getFreqDomainResults(char* char_Address,int int_NumChann,int int_SamplingFreq){
    namespace_top_of_FDD::FDD_Ptr_Object->m_char_Address=char_Address;
    namespace_top_of_FDD::FDD_Ptr_Object->m_int_NumChann=int_NumChann;
    namespace_top_of_FDD::FDD_Ptr_Object->m_int_SamplingFreq=int_SamplingFreq;
    namespace_top_of_FDD::FDD_Ptr_Object->getMatrixOfChannels();
    namespace_top_of_FDD::FDD_Ptr_Object->getCPSD();
    namespace_top_of_FDD::FDD_Ptr_Object->getSVD();
    namespace_top_of_FDD::FDD_Ptr_Object->getFreqDomainResultsPrinted();
    namespace_top_of_FDD::FDD_Ptr_Object->getFreqPlot();
}

//Exported function to be called by Link_DLL
//To pass user-selected natural frequencies from Link_DLL to FDD_DLL
//User-selected natural frequencies should be inside a text file
//Address of text file is passed
//FDD_DLL would read text file
extern "C" __declspec(dllexport)
void OPS_FDD_setNaturalFreqSelectedByUser(const char* char_Address_File_naturalFreqSelectedByUser){
    namespace_top_of_FDD::FDD_Ptr_Object->getNaturalFreqValue(char_Address_File_naturalFreqSelectedByUser);
}

//Exported function to be called by Link_DLL
//To run FDD object methods
//FDD object methods will return results inside text files
//Results are mode shapes at user-selected natural frequencies
//Finally FDD object pointer will be de-allocated (delete)
extern "C" __declspec(dllexport)
void OPS_FDD_getModeShapesResults(){
    namespace_top_of_FDD::FDD_Ptr_Object->get_NaturalFreqIndex_from_NaturalFreqValue();
    namespace_top_of_FDD::FDD_Ptr_Object->getRealModesFromComplexModesAtNaturalFreq();
    namespace_top_of_FDD::FDD_Ptr_Object->getModeShapesNormalized();
    namespace_top_of_FDD::FDD_Ptr_Object->getModeShapesPrinted();
    //namespace_top_of_FDD::FDD_Ptr_Object->getModesPlot();
    namespace_top_of_FDD::FDD_Ptr_Object->getNormalizedModesPlot();
    //namespace_top_of_FDD::FDD_Ptr_Object->getNormalizedModesPlotAtSinglePlot();
    namespace_top_of_FDD::FDD_Ptr_Object->~FDD();
    //delete namespace_top_of_FDD::FDD_Ptr_Object;//de-allocating makes C# executable (GUI) not able to re-execute without having to close GUI!
    //namespace_top_of_FDD::FDD_Ptr_Object=NULL;
}

FDD::FDD()
        :m_char_Address(""),m_int_NumChann(0),m_int_SamplingFreq(0)
    {
    }

FDD::~FDD(){
}

// The rest of the C++ code inside FDD_DLL.dll is just implementation of methods of FDD class...

可以看到,FDD_DLL.DLL中有一行“
delete namespace_top_of_FDD::FDD_Ptr_Object;
”,当我注释掉该行时,可以多次单击C#GUI的按钮,但当我取消注释该行时,第一次单击C#GUI的按钮会工作,但第二次程序崩溃。。如果您有任何想法,请告诉我…

问题现在已解决:

正如AlexD提到的,问题是物体的双重破坏。我的代码中有以下语句:

namespace_top_of_FDD::FDD_Ptr_Object->~FDD();
    delete namespace_top_of_FDD::FDD_Ptr_Object;
    namespace_top_of_FDD::FDD_Ptr_Object=NULL;
问题在于,显式调用析构函数时,使用~FDD::FDD_Ptr_Object->~FDD()的
namespace_top_删除\u FDD::FDD\u Ptr\u对象的名称空间\u top\u进行编码>和反分配相互冲突。在许多情况下,显式调用对象析构函数是一个坏主意。解决方案是删除对对象析构函数的显式调用,因此现在我只需要取消分配:

delete namespace_top_of_FDD::FDD_Ptr_Object;
    namespace_top_of_FDD::FDD_Ptr_Object=NULL;

现在代码工作得很完美

是否您在
OPS\u Link\u LoadFDD
中执行
delete
?或者“代码>删除/代码>何时发生?“删除在C++ DLL的最后一行发生”,你的意思是你在返回之前删除对象吗?你能发布<代码> opsl Link KLoad FDD<代码>吗?不,你发布了你所有的代码!请将其简化为一个小的工作示例来重现您的问题…@user3853917似乎
FDD\u Ptr\u对象
在加载DLL时创建一次,并在每次调用
OPS\u FDD\u getModeShapesResults
时删除。这可能是原因吗?顺便说一句,为什么要显式调用dtor:
namespace\u top\u of_FDD::FDD\u Ptr\u Object->~FDD()