C++/CLI主要用于对c++编译的dll进行封装,方便.net调用。既然说到C++,难免dll中会有多处使用到指针,比较常见的就是外部传入一个
List<string>
,需要在CLI中转化成char**,然后才能调用对应的c++方法。作为中间变量,这些被我们临时生成的指针需要手动释放。简单场景代码如下:
array<String^>^ list;
int count = list->Length;
char** arrays = new char*[count];
for (int i = 0; i < count; i++)
arrays[i] = (char*)(void*)Marshal::StringToHGlobalAnsi(list[i]);
for (int i = 0; i < count; i++)
delete arrays[i];
delete[] arrays;
基本上c++的指针释放都是这么操作。但是在C++/CLI中就出现了错误,释放内存时出现溢出。
尝试过只使用delete[] arrays
。能正常运行,但是内存没有被正确释放。
char* ptr = (char*)(void*)Marshal::StringToHGlobalAnsi(string)
,这是托管字符串转非托管char
指针的操作。对应的内存释放操作是Marshal::FreeHGlobal(IntPtr(ptr))
- 这个场景下的二维数组
char**
内存释放应该由两部分组成。释放成员指针,再释放数组指针。
for (int i = 0; i < count; i++)
Marshal::FreeHGlobal(IntPtr(arrays[i]));
delete[] arrays;
- 经10万次循环测试,没有出现内存溢出。而原方法在循环几百次后,内存已经泄露了100MB以上。
相关参考:
- https://m.imooc.com/article/30475
- https://stackoverflow.com/questions/6754415/free-delete-a-char-causes-an-invalid-heap-pointer-assertion-failure
- 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;lt;string&amp;gt;,需要在CLI中转化成char**,然后才能调用对应的c++方法。作为中间变量,这些被我们临时生成的指针需要手动释放。简单场景代码如下:array&amp;lt;String^&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`类型是无符号的。所以在进行转换时,需要确保数据的正确性。