c++给node写组件,c++中要用到一个比较大的字符串,编译没问题,但测试时运行就会出错
发布于 3天前 作者 JimiZhang 256 次浏览 来自 问答

如下是一个简单的测试代码,实现字符串格式的数字加法:

//add.cc

#include <node.h>
#include <v8.h>
#include <iostream>
#include <windows.h>

#define MAX_LEN  2048000
using namespace v8;
using std::cout;
using std::endl;

Handle<Value> Max(const Arguments& args) 
{
    HandleScope scope;

    if (args.Length() < 2) 
    {
        ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));
        return scope.Close(Undefined());
    }

    if (!args[0]->IsString() || !args[1]->IsString()) 
    {
        ThrowException(Exception::TypeError(String::New("Wrong arguments")));
        return scope.Close(Undefined());
    }
    char szTemp1[MAX_LEN] = {0};
    char szTemp2[MAX_LEN] = {0};
    Local<String> str1 = args[0]->ToString();
    Local<String> str2 = args[1]->ToString();
    
    str1->WriteUtf8(szTemp1);
    str2->WriteUtf8(szTemp2);
        
    Local<Number> num = Number::New(atoi(szTemp1) + atoi(szTemp2));
    return scope.Close(num);
}
void Init(Handle<Object> exports) 
{
  exports->Set(String::NewSymbol("add"),FunctionTemplate::New(Max)->GetFunction()); 
}
NODE_MODULE(add, Init)

//test.js
var addon = require('./build/Release/add');
console.log(addon.add('3','4'));

发现把add.cc中的MAX_LEN改小一点就没问题了,但实际项目中,需要c++中定义很大的字符串,这个要怎么解决呢?请各位大神帮帮忙!不胜感激!
4 回复

大家有好的解决方案吗?遇到这种问题该怎么解决啊?

char szTemp1[MAX_LEN] = {0};

数组在stack空间 stack空间大小有限制 不能太大 改进的方法:使用 new 分配heap空间 大小可以上GB tips:记得delete

可能是栈(stack)溢出了,linux下最大16M,还可以,windows下估计就溢出了。

char szTemp1[MAX_LEN] = {0};
char szTemp2[MAX_LEN] = {0};

这两句是分配在栈上的,你用new分配到堆(heap)上试一试。

不管如何,大内存分配最好都分配在堆(heap)上,c++用new/delete,c用malloc/free。

试了一下,用new就ok了,谢谢各位大神!

回到顶部