簡體   English   中英

使用const_cast添加const時的未定義行為?

[英]Undefined behavior when adding a const with const_cast?

這個問題與我在使用const_cast制作char * const char *觀察到的行為有關。 我知道,這鑄件含蓄和T為我做工作時,劇組正在隱式進行。

有問題的代碼是:

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("ENV_VAR")); // PROBLEM !!
}

按照Linux手冊頁, getenv()接受const char *並返回char* 因此,根據對const正確性的理解,我可以對char*進行const轉換,而不會出現任何問題。

所以,我的問題是,為什么const_cast在這里給我一個UB(代碼崩潰),但是按預期的方式在沒有const_cast (隱式轉換)的情況下可以正常工作(所以問題必須出在使用const_cast )?

請注意,我知道隱式轉換是解決問題的方法,通過這篇文章,我需要專門針對此處觀察到的行為的答案。

編輯:

由於該錯誤是So'ers同行無法復制的,因此我認為這是一些奇怪的運行時/編譯器問題。 但是,請讓我知道標准中是否提到了諸如此類的問題。

我暫時接受邁克的回答。

您正在轉換函數指針,而不是函數返回的指針。 首先使用()調用函數, 然后轉換結果。

編輯:我無法重現該問題。 這是我使用的代碼:

#include <cstdlib>
#include <iostream>

using namespace std;
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("PATH"));
    cout << "Got: " << org_str << endl;
}

這是我得到的:

$ g++ foo.cc -o foo.app
$ ./foo.app
Got: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/X11R6/bin
$

順便說一句,分配給NULL是不必要的; 建議的做法是使用以下方法之一:

const char *org_str = const_cast<const char*>(getenv("PATH"));

const char *org_str(const_cast<const char*>(getenv("PATH")));

const char *org_str(getenv("PATH"));

您不需要const_cast<>即可使const成為某種東西,只需要帶走const-ness。

而且我也不相信您那里的代碼是完全正確的,因為getenv是一個函數,並且看起來您將其用作變量。 也許這樣的事情會起作用:

const char * org_str = getenv("name-of-env");

據我了解,它不是您應該轉換的getenv的返回值,而是您擁有的const char。 由於org_str是常量,因此如果不使用const_cast就無法為其分配值,這意味着您需要執行以下操作:

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    const_cast<char*>(org_str) = getenv("ENV_VAR"); // NO PROBLEM !!
}

編輯:至於在getenv上具有const_cast,這是沒有意義的,因為您沒有分配給它,因此不會違反const表達式,因為

org_str = getenv("ENV_VAR") will give you.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM