C++ 无效读取大小 4 valgrind
C++ Invalid read size 4 valgrind
由于某种我无法弄清楚的原因,我收到 "invalid read size 4" 错误。我在网上搜索了一个答案,但它对我的代码并没有真正的帮助。总结一下我的代码的作用,它是一个股票交易模拟器。用户将看到选项,然后他们可以选择他们想做什么。现在我遇到了 "Sell a stock" 的问题。这是它的样子。
Stock* newStock = new Stock();
view->getStockData(newStock);
Stock* s = stocks->findElement(newStock);
if(s->getAOS()-newStock->getAOS() > 0) { // There is still some shares remaining
// Haven't done this yet
} else if (s->getAOS()-newStock->getAOS() == 0) { // There is no shares remaining
double result = s->calculate(newStock->getPrice(), s->getPrice(), s->getAOS());
view->printResults(result, 0);
stocks->remove(newStock);
} else { // Resulted with a negative value
// Haven't done this yet
}
view->getStockData(newStock);看起来像这样:
void UImanager::getStockData(Stock* stock) {
// Initializing all the stock data
string str = "";
string symbol, companyName;
double price;
int amountOfShares;
cout << endl << "Enter the stock's symbol (e.g. AAPL): ";
getline(cin, symbol);
cout << endl << "Enter the companies name: ";
getline(cin, companyName);
cout << endl << "Enter the price of the stock: ";
getline(cin, str);
stringstream ss(str);
ss >> price;
str = "";
cout << endl << "Enter the amount of shares: ";
getline(cin, str);
stringstream ss1(str);
ss1 >> amountOfShares;
str = "";
Stock* tmpStock = new Stock(symbol, companyName, price, amountOfShares);
*stock = *tmpStock;
delete tmpStock;
}
股票 class 看起来像这样:
Stock::Stock(string s, string c, double p, int aOS) {
symbol = s;
companyName = c;
price = p;
amountOfShares = aOS;
fee = 10;
}
string Stock::getSymbol() { return symbol; }
string Stock::getCompanyName() { return companyName; }
double Stock::getPrice() { return price; }
int Stock::getAOS() { return amountOfShares; }
int Stock::getFee() { return fee; }
bool Stock::operator==(Stock& s) {
if (this->getSymbol() == s.getSymbol()) {
return true;
}
return false;
}
// More below this, but that code doesn't matter for this problem
我将股票存储在我制作的模板化 Dlist 中。这是 findElement(T*):
template <class T>
T* Dlist<T>::findElement(T* item) {
Node<T>* currNode = head;
while (currNode != 0) { // iterate through the Dlist
if (currNode->data == item) { // uses the operator overloaded == from Stock
return currNode->data;
}
currNode = currNode->next;
}
// gets to this point if nothing was found
return 0;
}
valgrind 是这么说的:
==2459== Invalid read of size 4
==2459== at 0x804A4EC: Stock::getAOS() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8049356: SPTcontrol::launch() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8048F8D: main (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== Address 0x10 is not stack'd, malloc'd or (recently) free'd
==2459==
==2459==
==2459== Process terminating with default action of signal 11 (SIGSEGV)
==2459== Access not within mapped region at address 0x10
==2459== at 0x804A4EC: Stock::getAOS() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8049356: SPTcontrol::launch() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8048F8D: main (in /home/student/Desktop/Stock Paper Trading/spt)
所以我明白它告诉我在 Dlist 中找到我的股票 class 后访问信息有问题,但我真的不明白为什么或如何解决它?任何帮助将不胜感激。谢谢。
在我看来 s
是一个空指针,因为 Dlist::findElement
返回一个空指针。
最大的线索是 valgrind 抱怨的地址。你看到它说 "Address 0x10 is not stack'd, malloc'd or recently free'd" 了吗?真正的地址如此接近于零是非常不寻常的(阅读:几乎完全闻所未闻);这几乎总是意味着您的代码遇到了一个空指针,在大多数系统上它恰好由零地址表示,然后对其进行了一些算术运算(例如,如果 Stock
位于地址 0,则它的 amountOfShares
在哪里?地址 16 = 0x10,也许)。
您可以通过添加一些显式检查空指针的代码来检查这一点,或者 运行 您的代码在调试器中并单步执行它。
如果我的猜想是正确的(或者如果它是错误的但某些类似的猜想是正确的)将是您从 Dlist::findElement
获得空指针的原因。但我会让你自己解决这个问题。
由于某种我无法弄清楚的原因,我收到 "invalid read size 4" 错误。我在网上搜索了一个答案,但它对我的代码并没有真正的帮助。总结一下我的代码的作用,它是一个股票交易模拟器。用户将看到选项,然后他们可以选择他们想做什么。现在我遇到了 "Sell a stock" 的问题。这是它的样子。
Stock* newStock = new Stock();
view->getStockData(newStock);
Stock* s = stocks->findElement(newStock);
if(s->getAOS()-newStock->getAOS() > 0) { // There is still some shares remaining
// Haven't done this yet
} else if (s->getAOS()-newStock->getAOS() == 0) { // There is no shares remaining
double result = s->calculate(newStock->getPrice(), s->getPrice(), s->getAOS());
view->printResults(result, 0);
stocks->remove(newStock);
} else { // Resulted with a negative value
// Haven't done this yet
}
view->getStockData(newStock);看起来像这样:
void UImanager::getStockData(Stock* stock) {
// Initializing all the stock data
string str = "";
string symbol, companyName;
double price;
int amountOfShares;
cout << endl << "Enter the stock's symbol (e.g. AAPL): ";
getline(cin, symbol);
cout << endl << "Enter the companies name: ";
getline(cin, companyName);
cout << endl << "Enter the price of the stock: ";
getline(cin, str);
stringstream ss(str);
ss >> price;
str = "";
cout << endl << "Enter the amount of shares: ";
getline(cin, str);
stringstream ss1(str);
ss1 >> amountOfShares;
str = "";
Stock* tmpStock = new Stock(symbol, companyName, price, amountOfShares);
*stock = *tmpStock;
delete tmpStock;
}
股票 class 看起来像这样:
Stock::Stock(string s, string c, double p, int aOS) {
symbol = s;
companyName = c;
price = p;
amountOfShares = aOS;
fee = 10;
}
string Stock::getSymbol() { return symbol; }
string Stock::getCompanyName() { return companyName; }
double Stock::getPrice() { return price; }
int Stock::getAOS() { return amountOfShares; }
int Stock::getFee() { return fee; }
bool Stock::operator==(Stock& s) {
if (this->getSymbol() == s.getSymbol()) {
return true;
}
return false;
}
// More below this, but that code doesn't matter for this problem
我将股票存储在我制作的模板化 Dlist 中。这是 findElement(T*):
template <class T>
T* Dlist<T>::findElement(T* item) {
Node<T>* currNode = head;
while (currNode != 0) { // iterate through the Dlist
if (currNode->data == item) { // uses the operator overloaded == from Stock
return currNode->data;
}
currNode = currNode->next;
}
// gets to this point if nothing was found
return 0;
}
valgrind 是这么说的:
==2459== Invalid read of size 4
==2459== at 0x804A4EC: Stock::getAOS() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8049356: SPTcontrol::launch() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8048F8D: main (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== Address 0x10 is not stack'd, malloc'd or (recently) free'd
==2459==
==2459==
==2459== Process terminating with default action of signal 11 (SIGSEGV)
==2459== Access not within mapped region at address 0x10
==2459== at 0x804A4EC: Stock::getAOS() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8049356: SPTcontrol::launch() (in /home/student/Desktop/Stock Paper Trading/spt)
==2459== by 0x8048F8D: main (in /home/student/Desktop/Stock Paper Trading/spt)
所以我明白它告诉我在 Dlist 中找到我的股票 class 后访问信息有问题,但我真的不明白为什么或如何解决它?任何帮助将不胜感激。谢谢。
在我看来 s
是一个空指针,因为 Dlist::findElement
返回一个空指针。
最大的线索是 valgrind 抱怨的地址。你看到它说 "Address 0x10 is not stack'd, malloc'd or recently free'd" 了吗?真正的地址如此接近于零是非常不寻常的(阅读:几乎完全闻所未闻);这几乎总是意味着您的代码遇到了一个空指针,在大多数系统上它恰好由零地址表示,然后对其进行了一些算术运算(例如,如果 Stock
位于地址 0,则它的 amountOfShares
在哪里?地址 16 = 0x10,也许)。
您可以通过添加一些显式检查空指针的代码来检查这一点,或者 运行 您的代码在调试器中并单步执行它。
如果我的猜想是正确的(或者如果它是错误的但某些类似的猜想是正确的)将是您从 Dlist::findElement
获得空指针的原因。但我会让你自己解决这个问题。