相关疑难解决方法(0)

在C ++中使用nan初始化内存以进行调试

如何在启动时将ac或c ++程序中的所有内存初始化为NaN(非数字)以进行gdb调试?

我相信默认情况下,gdb会以零初始化,但这通常对于查找由于初始化错误而崩溃的代码没有帮助。

PS:我想将每个变量和数组初始化为NAN(或一些垃圾),仅用于调试。我正在使用的程序具有数千个变量,因此更改每个变量非常繁琐...

c c++ linux debugging gdb

5
推荐指数
2
解决办法
2534
查看次数

智能指针排序矢量:神秘崩溃

我正在尝试将智能指针的向量排序到类.我使用结构作为第三个参数来std::sortoperator():

struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
        if (a.get() == nullptr)
            return b.get() != nullptr;
        if (b.get() == nullptr)
            return a.get() != nullptr;
        return *a < *b;
    }
};
Run Code Online (Sandbox Code Playgroud)

偶尔,我得到一个分段错误,其中比较方法中的一个指针指向无效的结构; 总是一个.有趣的是,在排序之前,所有对象都是完整的; 我也尝试修改函数来删除引用位:const std::shared_ptr<Phrase> a,并在其他地方崩溃.

电话没什么特别的:

std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer()); 
Run Code Online (Sandbox Code Playgroud)

有什么我想念的东西或者我应该在其他地方寻找吗?

c++ sorting smart-pointers

5
推荐指数
1
解决办法
304
查看次数

将 C++ 中内存地址的值打印为十六进制

我正在尝试制作一个程序,它接收一个整数值,然后以十六进制打印出四个字节中的每一个的值。所以对于 255,它应该打印出 FF 00 00 00。这就是我的代码到目前为止的样子。

#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    int num;
    cout << "Enter an integer" << endl;
    cin >> num;

    int* p = &num;
    unsigned char* q = (unsigned char*)p;

    for (int i = 0; i < 4; i++) {
        cout<< hex <<*(int*)(q+i) << " ";
    }

}
Run Code Online (Sandbox Code Playgroud)

当我输入 255 时,它会打印出ff cc000000 cccc0000 cccccc00什么是 c?

c++ hex

5
推荐指数
1
解决办法
1171
查看次数

引发访问冲突的安全方法

nullptr除了每次访问都会导致访问冲突之外,是否有一种安全的方法可以在 C++ 中创建指针?

我不成功的尝试之一是将 1 添加到nullptr.

在我的特殊情况下,我需要 Visual Studio 2019 的解决方案。

c++

5
推荐指数
0
解决办法
225
查看次数

如何在C++中检测未分配内存上的双删除或删除?

我正在编写全局删除/新运算符的调试版本来检测内存泄漏,双重删除和删除未分配的内存.

就"新"运算符而言,我覆盖全局新运算符并使用宏传递文件名和行号信息.重写的"new"运算符将地址中的内存地址,文件名,大小和行号信息存储在地址中.

我也覆盖了"删除"操作符,从地图中删除了已删除的地址'条目.现在我想将已删除的内存信息存储在另一个映射中,该映射存储调用"delete"的文件名和行号信息.

但是delete运算符只接受参数(要删除的对象的内存地址).有人可以告诉如何检测代码中的双删除吗?

c++ memory memory-leaks new-operator delete-operator

4
推荐指数
1
解决办法
1950
查看次数

调用函数时C++访问冲突读取位置0xcdcdcdcd错误

请考虑以下情况:

我有一个头文件及其相应的源文件:

exmp.h(头文件)

exmp.cpp(源文件)

在头文件中,我有一个函数声明,bubSort(...)其定义存在于

exmp.cpp

myClass::bubSort(...)
{

....
....

}
Run Code Online (Sandbox Code Playgroud)

其中,myClass->exmp.h中定义的类

现在为了bubSort(...)在另一个文件Sample.cpp中使用该函数,我myClassSample.h中声明了如下所示:

/*Sample.h*/
class myClass;

class sampleClass
{

  .....
  .....
  myClass *ptr;
};
Run Code Online (Sandbox Code Playgroud)

现在使用上面的内容ptr,我正在尝试访问bubSort(...)Sample.cpp,如下所示:

//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
     ....
     ....
     ptr->bubSort(...);
}
Run Code Online (Sandbox Code Playgroud)

上面的场景在编译期间没有给出任何错误,但是在执行时,当控件到达时ptr->bubSort(...);,我得到一个异常:

访问冲突读取位置0xcdcdcdcd

有人会告诉我怎么能避免这种情况吗?

提前致谢.

c++ exception visual-c++

3
推荐指数
1
解决办法
3万
查看次数

来自WinMain的奇怪回归行为

首先,我应该指定我正在使用Visual Studio中的clang编译器.在调试以下简单程序时,WinMain函数在满足特殊条件时返回变量的值.

#include <windows.h>    

int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    int var = 1;
    var = var + 5;
}
Run Code Online (Sandbox Code Playgroud)

上面的内容将在调试器中输出:The program '[11396] Project1.exe' has exited with code 6 (0x6).只要在赋值的右侧表达式中有变量名,这种行为似乎就会发生.如果我要修改最后一行只分配一个文字,例如var = 5,每次输出都是一致的无关值:The program '[4148] Project1.exe' has exited with code -858993460 (0xcccccccc).

我怀疑这种行为与WinMain有关,因为当我使用普通的main()代替时,我得到预期的0的返回值.任何关于这种奇怪行为可能是什么原因的想法?

c windows

3
推荐指数
1
解决办法
83
查看次数

默认和零初始化

#include <string>
 
struct T1 { int mem; };
 
struct T2
{
    int mem;
    T2() { } // "mem" is not in the initializer list
};
 
int n; // static non-class, a two-phase initialization is done:
       // 1) zero initialization initializes n to zero
       // 2) default initialization does nothing, leaving n being zero
 
int main()
{
    int n;            // non-class, the value is indeterminate
    std::string s;    // class, calls default ctor, the value is "" (empty string)
    std::string a[2]; // …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
113
查看次数

如何检查变量是否在C中的内存0xfdfdfdfd中?

我有一个代码来检查变量的条件.

有时这个变量在内存中0xfdfdfdfd,当然它不能从那里读取.

如果变量为null,我会

 if(!variable)
 {
     //report error or skip...
 }
 else 
 {
     //do stuff with the variable...
 }
Run Code Online (Sandbox Code Playgroud)

但显然0xfdfdfdfd意味着有一个变量,我只是无法访问它.

有没有我可以使用的检查(比如null),所以当我无法访问它时,我不会尝试弄乱变量?

c memory

2
推荐指数
2
解决办法
239
查看次数

为什么调用堆栈不显示以前的调用?

在我的 VS2022 C++ 项目中,一段时间后出现问题。因为错误仅在 10 分钟后发生,所以我需要检查调用堆栈以查看错误发生之前发生了什么。

但是,调用堆栈太小。

它只是显示了这一点:

在此输入图像描述

我已经手动设置断点来跟踪它,所以我知道在“ProcessTxtLine”之前有几个我自己的函数(显示在调用堆栈中),但在调用堆栈中它们不存在。所以我无法双击它们来快速到达那里。

因为我不知道还有什么可能是重要的,所以我发布了整个 VS 2022 窗口的屏幕截图。

谢谢。

在此输入图像描述

编辑:

根据建议,我单击了第一个条目,然后选择了“加载符号”。

然而,这并没有帮助。它确实显示了更多,但仍然不是“我的”呼叫。

在此输入图像描述

c++ callstack visual-studio-2022

2
推荐指数
1
解决办法
354
查看次数