2016-03-20 5 views
0

Mein Code erstellt und läuft gut bis zum eigentlichen Ende des Programms, wenn es ein Problem mit Zeile 909 von xmemory0 hat.xmemory0 Ausnahme bei void Freigabe

Mein Code ist der Anfang eines sehr einfachen Twitter-Clients, das Problem trat nur wirklich auf, als ich anfing, meine Klassen zu bauen. Ich bin zu 99% sicher, dass es mit meinem Vektor zu tun hat, aber ich habe noch nicht wirklich etwas damit gemacht, also bin ich mir nicht sicher. Wenn ich online nach diesem Fehler suche, kann ich keine ähnlichen Probleme finden. Da ich die Twitcurl-Bibliothek benutze, wäre es sehr schwierig und unfair, jemanden zu bitten, alles zu kompilieren, nur um meinen Code zu kompilieren, aber hier ist nur, um zu sehen, was ich habe das ist meine Header-Datei mit allen meinen Klassen

#pragma once 
#ifndef CLASSES_H 
#define CLASSES_H 
#include<string> 
#include<vector> 
#include"rapidjson/document.h" 
#include"rapidjson/reader.h" 
#include"rapidjson/writer.h" 
#include"rapidjson/stringbuffer.h" 
#include "rapidjson/rapidjson.h" 
#include"rapidjson/prettywriter.h" 
using namespace rapidjson; 


class tweet { 
public: 
    tweet(); 
    ~tweet(); 
    std::string userName; 
    std::string userid; 
    std::string tweetData; 

}; 
class timeline { 
public: 
    std::vector<tweet> tweets; 
    timeline(); 
    ~timeline(); 
    void set_userTimeline(std::string); 
}; 
class user:public timeline { 

    public: 
     user(); 
     std::string name; 
     std::string screenName; 
     std::string user_ID; 
     timeline userTimeline; 
     void loadUserData(std::string); 
     std::string get_name(); 
     std::string get_screenName(); 
     std::string get_user_ID(); 
     void set_name(std::string); 
     void set_screenName(std::string); 
     void set_user_ID(std::string); 
     ~user(); 
}; 

#endif /*CLASSES_H*/ 

meine Implementierungsdatei

#include "classes.h" 

tweet::tweet() 
{ 

} 
tweet::~tweet() 
{ 

} 

timeline::timeline() 
{ 

} 
timeline::~timeline() 
{ 

} 
void timeline::set_userTimeline(std::string) 
{ 

} 
user::user() 
{ 

} 
std::string user::get_name() 
{ 
    return name; 
} 
std::string user::get_screenName() 
{ 
    return screenName; 
} 
std::string user::get_user_ID() 
{ 
    return user_ID; 
} 
void user::set_name(std::string n) 
{ 
    name = n; 
} 
void user::set_screenName(std::string sn) 
{ 
    screenName = sn; 
} 
void user::set_user_ID(std::string id) 
{ 
    user_ID = id; 
} 

void user::loadUserData(std::string input) 
{ 
    bool userLoaded = false; 
    std::string json; 
    json = input; 
    Document d; 
    d.Parse(json.c_str()); 
    assert(d.IsObject()); 
    assert(d.HasMember("id_str")); 
    assert(d.HasMember("name")); 
    assert(d.HasMember("screen_name")); 
    assert(d["name"].IsString()); 
    assert(d["screen_name"].IsString()); 
    assert(d["id_str"].IsString()); 
    set_user_ID(d["id_str"].GetString()); 
    set_name(d["name"].GetString()); 
    set_screenName(d["screen_name"].GetString()); 


} 
user::~user() 
{ 

} 

und mein Haupt

#include<string> 
#include<iostream> 
#include "twitcurl.h" 
#include "curl/curl.h" 
#include"classes.h" 

FILE _iob[] = { *stdin, *stdout, *stderr }; 

extern "C" FILE * __cdecl __iob_func(void) 
{ 
    return _iob; 
} 



int main(int argc, char *argv[]) 
{ 


    ///first screen login or exit 

    std::string choice; 
    std::cout << "Press" << std::endl << "1 to login" << std::endl << "2 to exit" << std::endl; 
    std::cin >> choice; 
    int intChoice = std::stoi(choice, nullptr); 
    if (intChoice == 0) 
    { 
     return 0; 

    } 
    else if (intChoice == 1) 


    { 
     /*choice = ""; 
     intChoice = 0;*/ 
     std::string userName = "Jordash90"; 
     std::string passWord = "*******"; 
     /*std::cout << "Please enter your twitter username->" << std::endl; 
     std::cin >> userName; 
     std::cout << "Please enter your twitter password->" << std::endl; 
     std::cin >> passWord;*/ 

     twitCurl twitterObj; 
     std::string tmpStr, tmpStr2; 
     std::string replyMsg; 
     char tmpBuf[1024]; 

     /* Set twitter username and password */ 
     twitterObj.setTwitterUsername(userName); 
     twitterObj.setTwitterPassword(passWord); 

     //SETMYKEYS AND SECRET OAUTHSTUFF 
     twitterObj.getOAuth().setConsumerKey(std::string("bHnCXjV*************47Jk")); 
     twitterObj.getOAuth().setConsumerSecret(std::string("fmjE*********VrzK7JoZWg28NECB0Eu5xsAQxXbOYdjjA")); 

     // 
     std::string oAuthUrl; 
     twitterObj.oAuthRequestToken(oAuthUrl); 
     twitterObj.oAuthHandlePIN(oAuthUrl); 

     twitterObj.oAuthAccessToken(); 

     std::string myAccessTokenKey; 
     std::string myAccessTokenSecret; 
     twitterObj.getOAuth().getOAuthTokenKey(myAccessTokenKey); 
     twitterObj.getOAuth().getOAuthTokenSecret(myAccessTokenSecret); 
     //save these for later 
     std::ofstream tokenKeySave; 
     std::ofstream tokenSecretSave; 
     tokenKeySave.open("twitterClient_token_key.txt"); 
     tokenSecretSave.open("twitterClient_token_secret.txt"); 

     tokenKeySave.clear(); 
     tokenSecretSave.clear(); 

     tokenKeySave << myAccessTokenKey.c_str(); 
     tokenSecretSave << myAccessTokenSecret.c_str(); 

     tokenKeySave.close(); 
     tokenSecretSave.close(); 

     /////actually trying to do something with this 

     user currentUser; 
     /* Account credentials verification */ 
     if (twitterObj.accountVerifyCredGet()) 
     { 
      twitterObj.getLastWebResponse(replyMsg); 

      currentUser.loadUserData(replyMsg); 


      std::cout << "User name: " << currentUser.get_name() << std::endl; 
      std::cout << "User ID: " << currentUser.get_user_ID() << std::endl; 
      std::cout << "User screen name: " << currentUser.get_screenName() << std::endl; 
      std::cout << "login successful! :) " << std::endl; 
     } 
     else 
     { 
      twitterObj.getLastCurlError(replyMsg); 
      printf("\ntwitterClient:: twitCurl::accountVerifyCredGet error:\n%s\n", replyMsg.c_str()); 
     } 
    } 

    system("PAUSE"); 


    return 0; 

}; 
+0

Es bedeutet, dass Sie den Speicher irgendwo beschädigt haben. Sehr verdächtig ist 'FILE _iob [] = {* stdin, * stdout, * stderr};'. 'FILE' Objekte sind nicht kopierbar. Die Neudefinition der internen Funktion "__iob_func" verlangt ebenfalls Probleme. –

+0

Ist das die kleinste mögliche Form Ihres Codes, die das Problem reproduzieren wird? Welche Eingaben verwenden Sie, um das Problem zu reproduzieren? –

+0

@RaymondChen Die Datei _iob Teil ist notwendig, um die Bibliothek im Arbeiten mit Visual Studio 2015 zu bekommen, da es ziemlich alt ist und ursprünglich auf VS06 oder etwas verwendet wurde. Sie können den Fehler nicht reproduzieren, es sei denn, Sie erstellen libcurl und twitcurl, was einige Zeit dauern würde. Was ich mich wundere ist, wenn dieser Fehler in irgendeiner Weise mit der Tatsache in Zusammenhang stehen könnte, dass meine Benutzerklasse eine Instanz der Zeitleiste hat und meine Zeitleistenklasse ein Vektor von Tweets ist? Dies begann erst, als ich die letzten beiden Klassen in meinen Code einführte. – J0rdy

Antwort

0

Das Problem war wegen mir nicht die tweet Klasse Öffentlichkeit zu der Zeit, zu erklären Linienklasse.

+0

Das macht keinen Sinn. Das hätte zu einem Fehler bei der Kompilierung und nicht zu einem Laufzeitfehler geführt.Außerdem ist die 'tweet'-Klasse in dem von Ihnen geposteten Code bereits vollständig öffentlich. –

+0

es immer noch behoben. – J0rdy

+0

Dann verstehe ich vielleicht nicht, was Sie meinen, indem Sie "die Tweet-Klasse für die Timeline-Klasse öffentlich deklarieren". Die Tweet-Klasse und die Timeline-Klasse sind Geschwister, also sind sie nicht "öffentlich" zueinander. Sie sind in einem absoluten Sinn nur öffentlich. Bitte teilen Sie die tatsächliche Codezeile, die geändert wurde, um das Problem zu beheben. –

Verwandte Themen