程序运行问题排查和解决:an instance of ‘std::logic_error‘what(): basic_string::_M_construct null not valid

简介: 程序运行问题排查和解决:an instance of ‘std::logic_error‘what(): basic_string::_M_construct null not valid

报错:

terminate called after throwing an instance of 'std::logic_error'what():  basic_string::_M_construct null not valid


java程序调用jni接口运行服务,访问就会崩溃,idea报错如上,浏览器中则是无响应,且是跨域报错(这是服务停止无法请求导致的)。多次尝试后无果,逐一排查问题。


检查java程序和接口,没有错误,然后排查jni层代码,注掉jni调用c++层的接口,发现仍然有问题,那么问题应该是出在jni层。再逐步排查发现是jstring参数解析过程出现的问题。


解决问题:

由于需要,传入了jstring参数,参数可以为空可以有数据内容,参数在jni层解析转为string传入C代码,在C代码中判断处理。这里设计的参数为空传入形式可以是info=null;或者info=“”;为此在传入“”后出现了上述报错导致程序无法运行的情况。


jni层中使用的jstring2string函数为:

string jstring2string(JNIEnv *env, jstring jstr)//若jstr为“”时报错
{
  char* rtn = NULL;
  jclass clsstring = env->FindClass("java/lang/String");
  jstring strencode = env->NewStringUTF("GB2312");
  jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
  jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
  jsize alen = env->GetArrayLength(barr);
  jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
  if(alen>0)
  {
    rtn = (char*)malloc(alen + 1);
    memcpy(rtn, ba, alen);
    rtn[alen] = 0;
  }
  env->ReleaseByteArrayElements(barr,ba,0);
  string stemp(rtn);
  free(rtn);
  return stemp;
}

不难发现其中的原因:调用的jstring2string函数,传入空值"",alen=0,未处理却直接释放了相关内存,返回的也是坏内存,就会导致内存异常报错。


需要考虑到jstr=“”的情况,修改代码有:

string jstring2string(JNIEnv *env, jstring jstr)
{
  char* rtn = NULL;
  jclass clsstring = env->FindClass("java/lang/String");
  jstring strencode = env->NewStringUTF("GB2312");
  jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
  jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
  jsize alen = env->GetArrayLength(barr);
  jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
  if(alen>0)
  {
    rtn = (char*)malloc(alen + 1);
    memcpy(rtn, ba, alen);
    rtn[alen] = 0;
  }
    else
    {
        env->ReleaseByteArrayElements(barr,ba,0);
        return "";
    }
  env->ReleaseByteArrayElements(barr,ba,0);
  string stemp(rtn);
  free(rtn);
  return stemp;
}

修改后再运行程序测试就能够正常运行没有报错了,那么这个问题就解决了。

目录
相关文章
|
7月前
|
存储 安全 API
C++ 17 新特性 C++ String View:了解C++ 17 std::string_view的使用场景
C++ 17 新特性 C++ String View:了解C++ 17 std::string_view的使用场景
326 2
|
4月前
解决微软云Azure Function运行报错-Value cannot be null. (Parameter ‘provider‘)
解决微软云Azure Function运行报错-Value cannot be null. (Parameter ‘provider‘)
91 4
|
4月前
|
JavaScript 前端开发 C++
【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
|
6月前
|
安全 C++
C++一分钟之-字符串处理:std::string
【6月更文挑战第25天】`std::string`是C++文本处理的核心,存在于`<string>`库中。它支持初始化、访问、连接、查找、替换等操作。常见问题包括空指针解引用、越界访问和不当内存管理。要安全使用,确保字符串初始化,用`at()`检查边界,用`.empty()`检查空字符串,且无需手动释放内存。高效技巧包括预先分配内存、利用互转函数以及使用迭代器。记得正确比较和遍历字符串以保证代码效率和安全性。
81 5
|
6月前
|
JavaScript 前端开发 索引
JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型
【6月更文挑战第25天】JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型,而Object包括Array、Function等是引用类型。Objects可以包含键值对,Array是特殊的Object。Functions也是对象。`null`和`undefined`被视为特殊的原始值。
57 1
|
6月前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
81 1
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
|
6月前
|
Java
Java中判断String类型为空和null的方法
Java中判断`String`变量是否为空或`null`需用`== null`和`.isEmpty()`。示例代码提供两种方法:`main`方法直接判断,`safeGetString`方法提供默认值。当输入为`null`或空时,返回默认值。代码包含三个测试案例,分别处理`null`、空字符串和非空非`null`字符串。
134 0
|
6月前
|
存储 程序员 C++
stoll函数和std::to_string函数
stoll函数和std::to_string函数
96 0
|
7月前
|
C++
C++ std::string类的使用
C++ std::string类的使用
101 0