C#到C代码P/调用多个std:字符串声明导致堆栈损坏
C# to C code P/INvoke multiple std:string declarations lead to stack corruption
我构建了一个用外部导出的C DLL,以便从我的C#程序中调用它。调用对大多数功能都非常有效,但是当我需要将一些字符串从C#传递到C 时,存在问题。
。我将它们作为正常字符串传递,并以const char *接收。它们都很好,所有数据都在那里,但是后来我继续定义了几个字符串,从这些字符阵列中进行了几个字符串。代码继续没有任何问题,直到i退出函数为止。然后,它引发了一个例外,说最后一个定义的std :: string周围的堆栈已损坏,我真的不确定为什么是这种情况。我尝试了许多定义字符串的方法:复制它们,将编码从P/Invoke定义更改。
我正在从计时器线程中调用此功能的一些额外信息;正如我发现的那样,我提到的是,线程上的std :: string可能会出现一些问题。这是在X86中与2012年编辑的多CPU机器上完成的。还附加下面的相关代码
#define OPENCV2P4
#include "openfabmap.hpp"
#include <fstream>
#ifdef OPENCV2P4
#include <opencv2/nonfree/nonfree.hpp>
#endif
#include <stdio.h>
extern "C"
{
__declspec(dllexport) int generateBOWImageDescs( const char* _dataPath, const char* _bowImageDescPath,const char* _vocabPath ,int minWords)
{
std::string dataPath(_dataPath);
std::string bowImageDescPath( _bowImageDescPath);
std::string vocabPath(_vocabPath);
cv::FileStorage fs;
//ensure not overwriting training data
std::ifstream checker;
checker.open(bowImageDescPath.c_str());
if(checker.is_open()) {
checker.close();
return -1;
}
}
和C#
的电话 [DllImport(@"FabMapFabMapCPP.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int generateBOWImageDescs( string _dataPath, string _bowImageDescPath, string _vocabPath, int minWords);
任何帮助将不胜感激。这里也是这里的第一个问题,因此对问题的错误介绍的任何评论都将不胜感激。
编辑:好的,事实上,问题是$ cv :: filestorage fs;我从本质上删除了它,并且它开始工作,可能是由于分配不当或其他原因。
因此,这意味着OpenCV文件存储正在引起问题,但仍不确定为什么。
请查看此两个链接:
http://support.microsoft.com/kb/311259
http://msdn.microsoft.com/en-us/library/7b620dhe.aspx
基本上是char*是c#中的intptr,而不是字符串。
相关文章:
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- 为什么必须将 const 添加到 constexpr 中才能进行字符串文字声明?
- 如何声明接受字符串、返回void的闭包的类型
- 我在 c++ 中声明字符串类型时遇到问题
- 在此范围C 中未声明字符串和char变量
- 无法声明字符串变量
- C++可变内存中声明字符串文本
- 如何在 c++ 中的类中声明字符串成员
- 在arduino中声明字符串的问题
- 声明字符串流ss之间的差异;和std::字符串流ss;在C++中
- 如何让用户输入声明字符串数组的大小
- 用常量字符串和字符串常量声明字符串有什么区别
- 可以使用特定名称声明字符串[]
- 在类中声明字符串类型(c++)
- 在GNU c++中声明字符串数组
- c++无法在派生类中声明字符串
- 使用声明字符串的 cin.getline