具有正确地址但具有另一个随机值的 C++ 指针?
Posted
技术标签:
【中文标题】具有正确地址但具有另一个随机值的 C++ 指针?【英文标题】:C++ pointer with the right address but with another random value? 【发布时间】:2015-07-03 23:24:34 【问题描述】:我在 Qt 上执行此操作,但我认为这并不重要,因为它只是类(尽管其中一个是线程类)。
无论如何,关键是我的主函数中有一个 Vector,我试图将它传递给另一个类中的指针,但问题是,在那个类中,我得到了随机值。 我比较了地址,指针指向的地址和主向量的地址,它们是相同的,这意味着共享部分工作得很好,但由于某种原因我得到了不同的值。 谷歌搜索了几个小时后,我意识到由于我的向量在堆栈上,它会在返回时自动删除,这是合乎逻辑的,这可能是导致这个问题的原因,所以我决定使用“new”来声明我的主向量堆:
vector<int> * ids = new vector<int>;
我在另一个类中有一个双公共指针
vector<int> ** ids;
我将主向量的地址附加到它上面。 比较地址后,它们是相同的,所以我知道我所做的大部分是正确的,但由于某种原因,我仍然得到随机值。
可能是什么问题?我觉得我在某个地方犯了一个愚蠢的错误,但我厌倦了今天的思考,所以如果你能在这里帮我一把,那就太好了。
编辑:(添加的来源)
主窗口.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
;
#endif // MAINWINDOW_H
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <vector>
#include <iostream>
using namespace std;
class get_clients : public QThread
public:
vector<SOCKET> **clients;
void run()
cout << (*clients)->size() << endl;
;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
vector<SOCKET> * clients = new vector<SOCKET>();
get_clients * get_clients1 = new get_clients();
get_clients1->clients = &clients;
get_clients1->start();
MainWindow::~MainWindow()
delete ui;
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
【问题讨论】:
你将不得不提供更多代码 为什么是指向指针的指针?我猜你正在取消引用对象的一部分,这就是你得到这种行为的原因。尝试其他类中的单个指针。 James,基本上就是这样,除了类的形状什么的,没有别的东西可以提供。 fassl,我在 main 中使用了一个指针,因为据我谷歌搜索,将向量放在堆中可以解决这个问题,并且要访问该向量指针,我需要一个双指针在另一个上课,这就是我这样做的原因。我首先使用指针的原因是因为我想使用向量本身而不是它的副本。 其他类中不需要双指针 【参考方案1】:你一定是做错了什么。发布更多代码。 在迭代之前,您需要确保您的指针指向您的列表。 这是您正在尝试做的一个示例,并且效果很好:
int main()
std::vector<int>* myList = new std::vector<int>();
std::vector<int>** myListPtr = &myList;
(*myListPtr)->push_back(12);
myList->push_back(13);
for (auto& itm : *myList)
std::cout << itm << " address of item: " << &itm << std::endl;
for (auto& itm : **myListPtr)
std::cout << itm << " address of item: " << &itm << std::endl;
delete myList;
myListPtr = nullptr;
std::cin.get();
return 0;
【讨论】:
【参考方案2】:好的,这里是: 我基本上有这个重要的部分代码
vector<SOCKET> * clients = new vector<SOCKET>();
get_clients * get_clients1 = new get_clients();
get_clients1->clients = &clients;
get_clients1->start();
插入类的构造函数中,遗憾的是由于某种原因被自动删除,但它不应该,但我相信这是我自己的代码的一些问题。
这里所有问题的答案都是知道堆栈和堆之间的这个小区别;例如,每当一个函数在堆栈中声明一个变量时,该变量将在该函数返回/完成后立即从堆栈中删除,但是,当涉及到堆时,除非您将其删除,否则该变量不会被删除自己(例如使用免费)或整个过程结束。 因此,如果您希望您的变量持续存在,在使用 c++ 中的类时,最好将该变量在堆栈中声明为私有变量(更好),或者简单地在堆中任何您想要的地方声明它。
【讨论】:
您绝对必须了解此修复程序为何有效。否则就是货物崇拜节目。 我刚刚改进了答案,我认为对于面临同样问题的人来说应该绰绰有余。以上是关于具有正确地址但具有另一个随机值的 C++ 指针?的主要内容,如果未能解决你的问题,请参考以下文章
调用旧版 C API 时,如何在现代 C++ 中正确地将指向结构的指针转换为指向其他结构的指针?