添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

C++/CLI主要用于对c++编译的dll进行封装,方便.net调用。既然说到C++,难免dll中会有多处使用到指针,比较常见的就是外部传入一个 List<string> ,需要在CLI中转化成char**,然后才能调用对应的c++方法。作为中间变量,这些被我们临时生成的指针需要手动释放。简单场景代码如下:

    array<String^>^ list;//500个字符串
    int count = list->Length;
    char** arrays = new char*[count];
    for (int i = 0; i < count; i++)
    	arrays[i] = (char*)(void*)Marshal::StringToHGlobalAnsi(list[i]);
    // use arrays in C++ function
    //free memory
    for (int i = 0; i < count; i++)
    	delete arrays[i];
    delete[] arrays;

基本上c++的指针释放都是这么操作。但是在C++/CLI中就出现了错误,释放内存时出现溢出。
尝试过只使用delete[] arrays。能正常运行,但是内存没有被正确释放。

  1. char* ptr = (char*)(void*)Marshal::StringToHGlobalAnsi(string),这是托管字符串转非托管char指针的操作。对应的内存释放操作是Marshal::FreeHGlobal(IntPtr(ptr))
  2. 这个场景下的二维数组char**内存释放应该由两部分组成。释放成员指针,再释放数组指针。
 for (int i = 0; i < count; i++)
     Marshal::FreeHGlobal(IntPtr(arrays[i]));
 delete[] arrays;
  1. 经10万次循环测试,没有出现内存溢出。而原方法在循环几百次后,内存已经泄露了100MB以上。

相关参考:

  1. https://m.imooc.com/article/30475
  2. https://stackoverflow.com/questions/6754415/free-delete-a-char-causes-an-invalid-heap-pointer-assertion-failure
  3. https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.stringtohglobalansi?redirectedfrom=MSDN&view=netcore-3.1#System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi_System_String_
场景C++/CLI主要用于对c++编译的dll进行封装,方便.net调用。既然说到C++,难免dll中会有多处使用到指针,比较常见的就是外部传入一个List&amp;amp;lt;string&amp;amp;gt;,需要在CLI中转化成char**,然后才能调用对应的c++方法。作为中间变量,这些被我们临时生成的指针需要手动释放。简单场景代码如下:array&amp;amp;lt;String^&amp;amp;gt;^ list;//500个字符串i...
在实现业务功能的候,编写代码的候遇到一些奇怪的问题,做笔记汇总: 1: 用宏的方式实现日志打印,在编译的候一直有警告,报在宏定义的位置,如下: #define LOG(TAG, format, ...) \ do \
C++中可用new和delete关键字分配和释放内存,但是如果遇到指针数组(或指向指针的指针),分配和释放必须慎重,不然容易造成内存泄漏。 下面用一段代码给出如何使用指向指针的指针来分配和释放内存: int n; cin>>n; //分配内存 char** pStrArray = new char*[n]; for (int i=0;i<n;i++)...
大家都知道,这是分配100个int大小的内存地址,用完以后呢? 释放,一定要释放,如果不释放,这段内存会一直保存,如果你的malloc写在循环内,多大的内存最终都能耗尽 现在做个测试 环境:vs2015,win10 int main() int *p = (int*)malloc(100); _CrtDumpMemoryLeaks(); return
```cpp char* charPtr = "Hello"; unsigned char* unsignedCharPtr = reinterpret_cast<unsigned char*>(charPtr); 2. 使用`reinterpret_cast`: ```cpp char* charPtr = "Hello"; unsigned char* unsignedCharPtr = (unsigned char*)charPtr; 需要注意的是,这种转换可能会导致数据的丢失或截断,因为`char`类型是有符号的,而`unsigned char`类型是无符号的。所以在进行转换需要确保数据的正确性。