С++: Исключение произошло в script: basic_string:: _ S_construct NULL недействительно
Я возвращаю строку или NULL из функции базы данных в основную программу, иногда я получаю эту ошибку из исключения:
basic_string::_S_construct NULL not valid
Я думаю, что из-за возвращаемого значения NULL из функции базы данных? любые идеи???
string database(string& ip, string& agent){
//this is just for explanation
.....
....
return NULL or return string
}
int main(){
string ip,host,proto,method,agent,request,newdec;
httplog.open("/var/log/redirect/httplog.log", ios::app);
try{
ip = getenv("IP");
host = getenv("CLIENT[host]");
proto = getenv("HTTP_PROTO");
method = getenv("HTTP_METHOD");
agent = getenv("CLIENT[user-agent]");
if (std::string::npos != host.find(string("dmnfmsdn.com")))
return 0;
if (std::string::npos != host.find(string("sdsdsds.com")))
return 0;
if (method=="POST")
return 0;
newdec = database(ip,agent);
if (newdec.empty())
return 0;
else {
httplog << "Redirecting to splash page for user IP: " << ip << endl;
cout << newdec;
cout.flush();
}
httplog.close();
return 0;
}
catch (exception& e){
httplog << "Exception occurred in script: " << e.what() << endl;
return 0;
}
return 0;
}
Ответы
Ответ 1
Вы не можете вернуть NULL
(или 0
) из функции, объявленной для возврата string
, потому что не существует соответствующего неявного преобразования. Возможно, вы захотите вернуть пустую строку, хотя
return string();
или
return "";
Если вы хотите различать значение NULL
и пустую строку, тогда вам придется использовать либо указатели (умные, предпочтительные), либо, альтернативно, вы можете использовать boost::optional
Ответ 2
Это нарушение договора std::string
, чтобы построить его с помощью указателя null char
. Просто верните пустую строку, если указатель, который вы хотите построить, равен null.
например.
return p == NULL ? std::string() : std::string(p);
Ответ 3
Я бы попробовал изменить его, чтобы вернуть пустую строку вместо нуля и проверить длину строки.