3

我有以下我不明白的情况。我有一个应用程序,我在 NodeJS 中使用 Nan 调用 C++ 函数。C++端的代码如下:

#include <nan.h>
#include <iostream>

using namespace std;
using namespace Nan;
using namespace v8;

//
//  The function that we are going to call from NodeJS
//
NAN_METHOD(Combine)
{
    char str[80];

    strcpy (str,"these ");
    strcat (str,"strings ");
    strcat (str,"are ");
    strcat (str,"concatenated.");

    //
    //  Send the buffer back to NodeJS with the result of our calculation.
    //
    info
    .GetReturnValue()
    .Set(
        NewBuffer((char *) str, 80)
    .ToLocalChecked());
}

//
//  The constructor
//
NAN_MODULE_INIT(Init)
{
    //
    //  Expose the method or methods to NodeJS
    //
    Nan::Set(
        target,
        New<String>("combine").ToLocalChecked(),
        GetFunction(New<FunctionTemplate>(Combine)).ToLocalChecked()
    );
}

//
//  Load the constructor
//
NODE_MODULE(basic_nan, Init)

当我将我的 char 变量发送回 NodeJS 时,我得到 80 个字节,但它们充满了随机值。看起来好像str变量指向的地方在创建NewBuffer().

我的问题

我想得到一个关于发生了什么的解释,理想情况下得到一个潜在的解决方案。

4

2 回答 2

1

根据文档NewBuffer假设数据的所有权转移到缓冲区本身。
您的 char 数组根本没有被复制,如果它的范围消失,它就会消失,因此您会产生未定义的行为。
您应该在动态内存上分配数组并让缓冲区拥有它的所有权来解决问题。
换句话说,使用new运算符分配字符数组,将其传递给NewBuffer并且不要删除它

于 2016-10-11T16:50:46.960 回答
1

我认为问题在于char str[80];它将在堆栈中分配,一旦您的Combine方法完成,它将被释放(从堆栈中弹出)并被其他被推入堆栈的东西覆盖。

将其声明为char* str;并使用 动态分配它str = new char[80];。然后使用 strcpy 和 strcat 进行所有这些初始化。

于 2016-10-11T16:54:38.147 回答