具有正确地址但具有另一个随机值的 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++ 中正确地将指向结构的指针转换为指向其他结构的指针?

C ++ - 指向具有相同地址但不同值的不同对象的另一个非静态成员的非静态void *成员

函数指针返回具有局部性的 C++ 中的另一个函数指针

GO 一文搞懂指针和地址值的区别

从函数返回,具有动态字段的对象 c++

在 SQL 中选择具有一个最大值但另一个最小值的项目 [关闭]