2017-11-14 2 views
1

다음 단위 테스트는 일부 UnsafePointer가 다른 것과 동일하므로 항상 실패합니다. 이 동작은 적어도 3 개의 문자열을 관찰합니다. High Sierra 버전 10.13.1 (17B48)에서 Xcode 버전 9.1 (9B55)을 사용하고 있습니다.UnsafePointer <Int8> 작동하지 않습니다.

func testUnsafePointer() { 
    let a = "aaa" 
    let b = "bbb" 
    let c = "ccc" 

    let ua = UnsafePointer<Int8>(a) 
    let ub = UnsafePointer<Int8>(b) 
    let uc = UnsafePointer<Int8>(c) 

    print("a: '\(a)', ua: '\(ua)'") 
    print("b: '\(b)', ub: '\(ub)'") 
    print("c: '\(c)', uc: '\(uc)'") 

    XCTAssertTrue(ua != ub) 
    XCTAssertTrue(ub != uc) 
    XCTAssertTrue(uc != ua) 
} 

인쇄물이

a: 'aaa', ua: '0x000060c000056a30' 
b: 'bbb', ub: '0x00006080000530d0' 
c: 'ccc', uc: '0x00006080000530d0' 

NB 비슷합니다. 신속한 놀이터에서 모든 것이 괜찮아 보입니다.

let ua = UnsafePointer<Int8>(a) 

에서

+0

'UnsafePointer가 (a) '거의 확실 케이 당신이 생각하는대로하지 마라. Swift는 null로 끝나는 주어진 문자열의 UTF-8 바이트를 가진 새로운 버퍼를 만든 다음, 그 버퍼에 대한 포인터를 준다. 버퍼가 호출이 끝난 후에 할당 해제되므로 매달린 포인터가 남아있게됩니다. 따라서 동일한 값을 공유하는 포인터에 대해서는 의문의 여지가 없습니다. 하지만 포인터가 매달 렸기 때문에 역 참조를 시도하는 것은 정의되지 않은 동작입니다. 당신이 여기에서하려고하는 것은 무엇이든 거의 확실하게 그것에 대해가는 올바른 방법이 아닙니다. – Hamish

+0

@Hamish 이것은 행동을 설명합니다. 내가 의도 한 바는 바로이 문자열을 C 함수에 전달하는 것이다 : void cfunc (const char * a, const char * b, const char * c). 그러나이 cfunc에서 첫 번째 문자열은 괜찮습니다. 다른 문자열은 가비지입니다. UnsafePointer 변환으로이 함수를 호출합니다. – swift616

+2

@ swift616 :'cfunc (a, b, c)'를 호출하면 컴파일러는 자동으로 변환에 필요한 코드를 생성합니다. –

답변

2

UnsafePointer

init(_ other: UnsafePointer<Pointee>) 

초기화가 호출됩니다. 나는. a 스위프트 String을 인수로 전달하면 UnsafePointer<Int8> 인수를 취합니다. 이 경우 C 문자열 표현이 생성되어 함수로 전달되면 은 String value to UnsafePointer<UInt8> function parameter behavior과 비교됩니다.

일시적 C 문자열 함수 통화 시간 만 유효 함을

및 반환에, 메모리가 ua가 여전히 포함에 의해 을 지적하지는 않습니다 C 문자열 (또는 유효 데이터). 또한,

let ua = UnsafePointer<Int8>(a) 
let ub = UnsafePointer<Int8>(b) 
let uc = UnsafePointer<Int8>(c) 

는 관찰 포인터가 동일 할 것입니다 경우 에, 임시 C 문자열을 동일한 스토리지를 사용할 수 있습니다. 당신의 의도가 const char * 인수를 복용하는 C 함수를 호출하는 경우


, 당신은 단순히 스위프트 문자열을 전달할 수 있습니다. 컴파일러 은 (함수 호출의 지속 기간에 대해 다시 유효) C 문자열 표현 만드는 데 필요한 코드를 삽입 할 것이다 같이 String value to UnsafePointer<UInt8> function parameter behavior 설명 :

let a = "aaa" 
let b = "bbb" 
let c = "ccc" 

cfunc(a, b, c) 
+0

이것은 쉽습니다 :) Thx – swift616

관련 문제