谁给看下这个代码有什么问题?

jieao111 2018-08-04 08:13:48
问题描述:
该类被复制的时候,vector的push_back申请了一块很大的内存,导致系统崩溃



#include <string>
#include <vector>
#include <sstream>


using namespace std;


struct TreeNode
{
int fid;
double value;
int index;
int left;
int right;
int isleaf;
};

class TreeLoadHelper
{
public:
TreeLoadHelper()
{
};
~TreeLoadHelper()
{
};
double model_predict(const vector<double>& feature_list);
bool load(const string& path);
private:
vector<vector<TreeNode> > alltrees_noleaf;
vector<vector<TreeNode> > alltrees_leaf;
vector<string> split_vet;
vector<string> thred_vet;
vector<string> left_vet;
vector<string> right_vet;
vector<string> leaf_vet;
vector<string> parse_line(string line, string col_name);
double predict_onetree(vector<TreeNode>& no_leaf_node_vet,vector<TreeNode>& leaf_node_vet,vector<double> featlst);
template<typename Out>
void inner_split(const std::string &s, char delim, Out result) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
*(result++) = item;
}
}

std::vector<std::string> str_split(const std::string &s, char delim) {
std::vector<std::string> elems;
inner_split(s, delim, std::back_inserter(elems));
return elems;
}
};



上面是头文件,下面是原始文件
#include "TreeModel.h"
#include <fstream>
#include <cstdlib>





bool TreeLoadHelper::load(const string& path)
{
ifstream fin(path.c_str());
string line;
if (!fin) {
LOG_ERROR("load tree model file error:%s", path.c_str());
return false;
}
while(getline(fin, line)) {
if (line.find("Tree=")!=string::npos) {
if (!split_vet.empty() && !left_vet.empty() &&
!right_vet.empty() &&!leaf_vet.empty()) {
vector<TreeNode> no_leaf_node_vet;
vector<TreeNode> leaf_node_vet;
no_leaf_node_vet.clear();
leaf_node_vet.clear();
for (size_t i=0;i<split_vet.size();i++) {
no_leaf_node_vet.push_back(TreeNode());
}
for (size_t i=0;i<leaf_vet.size();i++) {
TreeNode leaf_node_ = TreeNode();
leaf_node_.isleaf = 1;
leaf_node_.index = -i-1;
//leaf_node_.value = stod(leaf_vet[i]);
leaf_node_.value = atof(leaf_vet[i].c_str());
leaf_node_vet.push_back(leaf_node_);
}
for (size_t i=0;i<split_vet.size();i++) {
TreeNode& index_node = no_leaf_node_vet[i];
index_node.index = i;
index_node.fid = atoi(split_vet[i].c_str());
index_node.value = atof(thred_vet[i].c_str());
int left_index = atoi(left_vet[i].c_str());
int right_index = atoi(right_vet[i].c_str());
index_node.left = left_index;
index_node.right = right_index;
}
alltrees_noleaf.push_back(no_leaf_node_vet);
alltrees_leaf.push_back(leaf_node_vet);
}
split_vet.clear();
thred_vet.clear();
left_vet.clear();
right_vet.clear();
leaf_vet.clear();

}
else {
if (split_vet.empty()) {
split_vet = parse_line(line, string("split_feature="));
}
if (thred_vet.empty()) {
thred_vet = parse_line(line, string("threshold="));
}
if (left_vet.empty()) {
left_vet = parse_line(line, string("left_child="));
}
if (right_vet.empty()) {
right_vet = parse_line(line, string("right_child="));
}
if (leaf_vet.empty()) {
leaf_vet = parse_line(line, string("leaf_value="));
}
}
}
return true;
}

double TreeLoadHelper::predict_onetree(vector<TreeNode>& no_leaf_node_vet,
vector<TreeNode>& leaf_node_vet,
vector<double> featlst) {
int num = 0;
int index = 0;
while(num<1000) {
num+=1;
TreeNode* root = NULL;
if (index>=0) {
root = &no_leaf_node_vet[index];
}
else {
root = &leaf_node_vet[-index-1];
}
if (root == NULL) {
return 0.0;
}
if (root->isleaf==1) {
return root->value;
}
else {
if (featlst[root->fid-1]<=root->value) {
index = root->left;
} else {
index = root->right;
}
}
}
return 0.0;
}

vector<string> TreeLoadHelper::parse_line(string line, string col_name)
{
vector<string> feat_vet;
if(line.find(col_name)!=string::npos)
{
string feat_str = line.substr(col_name.length(),string::npos);
feat_vet = str_split(feat_str , ' ');
}
return feat_vet;
}
double TreeLoadHelper::model_predict(const vector<double>& feature_list)
{
double pred = 0.0;
for (size_t i=0;i<alltrees_noleaf.size();i++) {
double score = predict_onetree(alltrees_noleaf[i], alltrees_leaf[i], feature_list);
pred+=score;
}
return pred;
}


...全文
249 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberLogix 2018-08-09
  • 打赏
  • 举报
回复
调试下,看崩溃在哪里了,查看callstack,分析问题的原因
cjzzmdn 2018-08-09
  • 打赏
  • 举报
回复

main函数和数据呢
赵4老师 2018-08-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
zhouqunhai 2018-08-07
  • 打赏
  • 举报
回复
在我的vs上正常运行
  • 打赏
  • 举报
回复
简单试了一下似乎没有什么问题。

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧