26

データベース関数からメインプログラムに文字列または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;
}
4

3 に答える 3

31

適切な暗黙の変換がないため、返すように宣言されている関数から戻るNULL(または)ことはできません。ただし、空の文字列を返したい場合があります0string

return string();

また

return "";

値と空の文字列を区別できるようにするNULL場合は、ポインタ(スマートなものが望ましい)を使用するか、またはstd::optional(またはboost::optionalC ++ 17より前の)ポインタを使用する必要があります。

于 2012-08-21T10:33:33.763 に答える
14

nullポインタstd::stringから構築することはの契約違反です。char構築するポインタがnullの場合は、空の文字列を返すだけです。

例えば

return p == NULL ? std::string() : std::string(p);
于 2012-08-21T10:34:00.910 に答える
2

nullではなく空の文字列を返すように変更して、文字列の長さを確認してみます。

于 2012-08-21T10:33:57.450 に答える