小编Gnt*_*ntS的帖子

在C++中访问环境变量

我想$HOME在我正在编写的C++程序中访问环境变量.如果我用C编写代码,我只是使用该getenv()函数,但我想知道是否有更好的方法来实现它.这是我到目前为止的代码:

std::string get_env_var( std::string const & key ) {                                 
    char * val;                                                                        
    val = getenv( key.c_str() );                                                       
    std::string retval = "";                                                           
    if (val != NULL) {                                                                 
        retval = val;                                                                    
    }                                                                                  
    return retval;                                                                        
}           
Run Code Online (Sandbox Code Playgroud)

我应该用getenv()C++访问环境变量吗?是否有任何我可能遇到的问题,我可以通过一点点知识来避免?

c++ environment-variables

64
推荐指数
4
解决办法
8万
查看次数

如何使用相对路径的fstream对象?

我是否总是必须为从std::fstream类中实例化的对象指定绝对路径?换句话说,有没有办法指定它们的相对路径,例如项目路径?

c++ fstream relative-path

24
推荐指数
2
解决办法
7万
查看次数

在字符串文字中展开宏

我想要做的是#define宏:

#define a(2)
Run Code Online (Sandbox Code Playgroud)

然后在字符串文字中使用它:string = "a";.

我希望该字符串不被解释为字符串,而是获取值a,即2.我没有成功,任何人都可以帮忙吗?

c++ macros visual-c++ c++11

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

如何解决访问冲突写入位置错误?

我有一个简单的程序,我得到访问冲突*(str + start).为什么?我应该能够改变它.对?

void fn()
{
     char *str = "Hello wordl!";
     int end = strlen(str);
     int start = 0;
     end--;
     while(start < end)
     {
         *(str + start) = *(str + end);  <--- Access violation writing location *(str + Start).
         end--;
         start++;
     }
}
Run Code Online (Sandbox Code Playgroud)

memory-management access-violation

11
推荐指数
2
解决办法
6万
查看次数

C++,防止在堆栈上创建类实例(在编译期间)

我知道有一些方法可以防止用户使用newdelete运算符来阻止在堆上创建类.我正试图做相反的事情.我有一个类,我想阻止用户在堆栈上创建它的实例,并且只有使用new运算符发起的实例才会编译.更具体地说,我希望以下代码在编译期间收到错误:

MyClass c1; //compilation error

MyClass* c1 = new MyClass(); //compiles okay
Run Code Online (Sandbox Code Playgroud)

通过搜索网络,我发现了如何做到这一点的建议:

class MyClass {
public:
    MyClass();
private:
    void destroy() const { delete this; }

...

private:
    ~MyClass();
};

int main(int argc,char** argv)
{
    MyClass myclass; // <--- error, private destructor called here !!!

    MyClass* myclass_ptr = new MyClass;
    myclass_ptr->destroy();
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这应该工作.为什么在创建实例时会调用析构函数MyClass

c++ class-design

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

如何在C++中打开具有相对路径的文件?

我现在正在编写测试用例,并创建了一些我尝试阅读的测试文件.绝对路径是:

/home/user/code/Project/source/Project/components/Project/test/file.dat
Run Code Online (Sandbox Code Playgroud)

但是出于明显的原因,用绝对路径进行测试是不好的.所以我尝试将绝对路径转换为相对路径,我不知道为什么它不起作用.我用相对路径创建了一个文件

findme.dat
Run Code Online (Sandbox Code Playgroud)

我找到了它

/home/user/code/Project/build/source/Project/components/Project/test/findme.dat
Run Code Online (Sandbox Code Playgroud)

所以我创建了相对路径

/../../../../../../source/Project/components/Project/test/file.dat
Run Code Online (Sandbox Code Playgroud)

但该文件未打开且与is对象 无关std::ifstream is (path);,并且该is.is_open()函数返回fulse.

你能帮助我吗?

c++ relative-path absolute-path ifstream

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

如何在boost(c ++)中将内存页锁定到物理RAM?

我在使用boost中的共享内存对象,因为需要将内存页锁定到物理内存中的实时C++应用程序.在增强中我没有看到这样做的方法.我觉得我错过了一些东西,因为我知道Windows和Linux都有办法做到这一点(mlock()VirtualLock()).

c++ boost shared-memory boost-thread

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

在堆上分配大约10GB的内存

我想在RAM上分配大约10 GB.但我得到错误:

错误C2148:数组的总大小不得超过0x7fffffff

我的简化代码是:

int main(){
    char* myBuffer = new char[11000000000];
    //char* myBuffer = new char[4000000000]; //compiled successfully
}
Run Code Online (Sandbox Code Playgroud)

我知道x86和x64之间的差异以及x86中的寻址大小限制.所以我将目标设置为x64.我也知道堆栈大小限制,但请注意我在堆上分配.

令人惊讶的是,当我使用下面的代码并成功编译时.

#include <memory>
int main(){
    char* myBuffer = (char*) malloc(11000000000); //compiled successfully even much more than this size
}
Run Code Online (Sandbox Code Playgroud)

我使用new运算符时代码出了什么问题?

环境: Visual Studio 2013使用空项目,Windows server 2008 R2 Datacenter,128 GB RAM.

编辑:nm提供的链接不能完全回答我的问题.我也想知道为什么malloc效果不错但不是new

c++ heap-memory new-operator

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

调用函数时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万
查看次数

在Windows中使用事件进行调试

如果我CreateEvent在Windows中使用创建事件,如何在Visual Studio中使用调试器检查是否发出了该事件的信号? CreateEvent返回一个句柄,它不会让我访问很多信息.在我打电话之前WaitForSingleObject(),我想检查事件是否在我进入该功能之前发出信号.

c c++ windows multithreading visual-studio

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